1. 概述

在这个快速教程中,我们将重点讲解如何使用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. 非void返回类型

首先,如果方法的返回类型不是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"));
}

请注意,我们已配置了返回类型为StringgetMeaning()方法,使其在被调用时抛出NullPointerException

*3. void返回类型*

现在,如果我们的方法返回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"));
}

在这里,我们配置了一个返回voidadd()方法,在调用时抛出IllegalStateException

对于void返回类型,我们不能使用when().thenThrow(),因为编译器不允许在括号内使用void方法。

4. 异常作为对象

为了配置异常本身,我们可以像之前示例那样传递异常的类,也可以作为对象:

@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. 模拟对象

我们还可以以与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"));
}

6. 总结

在这篇文章中,我们探讨了如何在Mockito中配置方法调用以抛出异常。

如往常一样,完整的源代码可以在GitHub上找到。