이 빠른 튜토리얼에서는 Mockito를 사용하여 예외를 발생시키는 메서드 호출을 구성하는 방법에 중점을 둘 것입니다. 라이브러리에 대한 자세한 내용은 Mockito 시리즈를 확인하세요. 다음은 우리가 사용할 간단한 사전 클래스입니다:
class MyDictionary {
private Map<String, String> wordMap;
public void add(String word, String meaning) {
wordMap.put(word, meaning);
}
public String getMeaning(String word) {
return wordMap.get(word);
}
}
먼저, 메소드 반환 유형이 void가 아닌 경우 when().thenThrow()를 사용할 수 있습니다.
@Test
void givenNonVoidReturnType_whenUsingWhenThen_thenExceptionIsThrown() {
MyDictionary dictMock = mock(MyDictionary.class);
when(dictMock.getMeaning(anyString())).thenThrow(NullPointerException.class);
assertThrows(NullPointerException.class, () -> dictMock.getMeaning("word"));
}
호출 시 NullPointerException을 발생시키도록 String 유형의 값을 반환하는 getMeaning() 메서드를 구성했습니다.
이제 메소드가 void를 반환하면 doThrow()를 사용합니다.
@Test
void givenVoidReturnType_whenUsingDoThrow_thenExceptionIsThrown() {
MyDictionary dictMock = mock(MyDictionary.class);
doThrow(IllegalStateException.class).when(dictMock)
.add(anyString(), anyString());
assertThrows(IllegalStateException.class, () -> dictMock.add("word", "meaning"));
}
여기서는 호출 시 IllegalStateException을 발생시키도록 void를 반환하는 add() 메서드를 구성했습니다. 컴파일러는 대괄호 안에 void 메소드를 허용하지 않기 때문에 void 반환 유형과 함께 when().thenThrow()를 사용할 수 없습니다.
예외 자체를 구성하려면 이전 예제에서처럼 예외 클래스를 객체로 전달할 수 있습니다.
@Test
void givenNonVoidReturnType_whenUsingWhenThenAndExeceptionAsNewObject_thenExceptionIsThrown() {
MyDictionary dictMock = mock(MyDictionary.class);
when(dictMock.getMeaning(anyString())).thenThrow(new NullPointerException("Error occurred"));
assertThrows(NullPointerException.class, () -> dictMock.getMeaning("word"));
}
doThrow()를 사용하여 동일한 작업을 수행할 수 있습니다.
@Test
void givenNonVoidReturnType_whenUsingDoThrowAndExeceptionAsNewObject_thenExceptionIsThrown() {
MyDictionary dictMock = mock(MyDictionary.class);
doThrow(new IllegalStateException("Error occurred")).when(dictMock)
.add(anyString(), anyString());
assertThrows(IllegalStateException.class, () -> dictMock.add("word", "meaning"));
}
또한 mock에서 했던 것과 동일한 방식으로 예외를 발생시키도록 Spy를 구성할 수도 있습니다.
@Test
void givenSpyAndNonVoidReturnType_whenUsingWhenThen_thenExceptionIsThrown() {
MyDictionary dict = new MyDictionary();
MyDictionary spy = Mockito.spy(dict);
when(spy.getMeaning(anyString())).thenThrow(NullPointerException.class);
assertThrows(NullPointerException.class, () -> spy.getMeaning("word"));
}