Mocking Exception Throwing using Mockito

Dev.Hammy·2024년 4월 1일

Mockito_Tutorial

목록 보기
4/21

1. Overview

이 빠른 튜토리얼에서는 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);
    }
}

2. Non-Void Return Type

먼저, 메소드 반환 유형이 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() 메서드를 구성했습니다.

3. Void Return Type

이제 메소드가 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()를 사용할 수 없습니다.

4. Exception as an Object

예외 자체를 구성하려면 이전 예제에서처럼 예외 클래스를 객체로 전달할 수 있습니다.

@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"));
}

5. Spy

또한 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"));
}

0개의 댓글