使用Mockito Mock异常抛出

2023/05/12

1. 概述

在本教程中,我们重点介绍如何使用Mockito配置方法调用以引发异常。

下面是我们将用作测试的MyDirectory类:

class MyDictionary {
    private Map<String, String> wordMap = new HashMap<>();

    public void add(String word, String meaning) {
        wordMap.put(word, meaning);
    }

    public String getMeaning(String word) {
        return wordMap.get(word);
    }
}

2. 非void返回值

首先,如果我们的方法返回类型不是void,我们可以使用when().thenThrow()子句:

class MockitoExceptionUnitTest {

    @Test
    void whenConfigNonVoidReturnMethodToThrowEx_thenExIsThrown() {
        MyDictionary dictMock = mock(MyDictionary.class);
        when(dictMock.getMeaning(anyString())).thenThrow(NullPointerException.class);

        assertThrows(NullPointerException.class, () -> dictMock.getMeaning("word"));
    }
}

请注意,我们将getMeaning()方法配置为在调用时抛出NullPointerException,该方法实际返回String类型的值。

3. void返回值

如果我们的方法返回值为void,我们可以使用doThrow().when()子句:

@Test
void whenConfigVoidReturnMethodToThrowEx_ThenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    doThrow(IllegalStateException.class).when(dictMock).add(anyString(), anyString());

    assertThrows(IllegalStateException.class, () -> dictMock.add("word", "meaning"));
}

在这里,我们配置了add()方法(它返回void)在调用时抛出IllegalStateException。我们不能将when().thenThrow()与void返回类型的方法一起使用,因为编译器不允许在括号内使用void方法。

4. 异常作为对象

要配置异常本身,我们可以像前面的示例中那样传递异常的Class或作为对象传递:

@Test
void whenConfigNonVoidReturnMethodToThrowExWithNewExObj_thenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    when(dictMock.getMeaning(anyString())).thenThrow(new NullPointerException("Error occurred"));
    
    assertThrows(NullPointerException.class, () -> dictMock.getMeaning("word"));
}

我们可以用doThrow()实现相同的效果:

@Test
void whenConfigVoidReturnMethodToThrowExWithNewExObj_thenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    doThrow(new IllegalStateException("Error occurred")).when(dictMock).add(anyString(), anyString());
    
    assertThrows(IllegalStateException.class, () -> dictMock.add("word", "meaning"));
}

5. Spy

我们还可以将Spy配置为抛出异常,与mock的方式相同:

@Test
void givenSpy_whenConfigNonVoidReturnMethodToThrowEx_thenExIsThrown() {
    MyDictionary dict = new MyDictionary();
    MyDictionary spy = Mockito.spy(dict);
    when(spy.getMeaning(anyString())).thenThrow(NullPointerException.class);
    
    assertThrows(NullPointerException.class, () -> spy.getMeaning("word"));
}

6. 总结

在本文中,我们介绍了如何配置方法调用以在Mockito中引发异常。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章