关于java:如何模拟/测试返回void的方法,可能在Mockito中

How to mock/test method that returns void, possibly in Mockito

我遇到了一个问题,找不到一个很好的解决办法。

所以问题在于模拟Selenium Web驱动程序,我不知道应该如何测试/模拟void方法。

1
2
3
4
public void clickAndWait(String locator) {
    if(isElementPresent(locator) == false) throw some exception;
    selenium.clickAndWait(); //a problematic delegating call to selenium
}

所以我要问的是,如何正确地测试这样一个方法,一个测试将用于异常被抛出,但是如何正确地对我委托给的那个无效方法进行测试呢?


此mockito文档中的以下代码示例说明了如何模拟void方法:

1
2
3
4
doThrow(new RuntimeException()).when(mockedList).clear();

// following throws RuntimeException:
mockedList.clear();


1
2
3
4
5
6
7
doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {

            return null;
        }
    }).when(mock).method((SomeClass) anyObject());


以前的答案一直在强调每次打电话都要做些什么(可能会抛出异常)。当你这样做的时候:

1
doThrow(new RuntimeException()).when(mockedList).clear();

然后调用存根服务(或逻辑),比如:

1
mockedList.clear();

它将生成一个异常。如果您想测试方法的正确功能,可以编写积极的测试用例。模拟这种情况下的空返回方法可以通过以下方式完成:

1
doNothing().when(mockedList).clear();

这意味着,由于您对mockedListmock使用了clear()方法,因此您可以确保此方法不会影响单元的逻辑,并且仍然可以检查流的其余部分而不生成异常。


您还可以使用:

  • 方法mockito.verify(mock/spy)检查调用该方法的次数。
  • 或者使用参数captor查看/检查传递给void方法的一些参数。

在Java 8中,这可以做得更干净一些。

1
2
3
4
doAnswer((i) -> {
  // Do stuff with i.getArguments() here
  return null;
}).when(*mock*).*method*(*methodArguments*);

return null;很重要,如果没有它,编译将失败,并出现一些相当模糊的错误,因为它无法找到适合doAnswer的覆盖。


您可以在方法调用上控制一个异常,下面是一个如何执行该操作的小示例:

1
doThrow(new RuntimeException()).when(mockedList).clear();

然后调用mockedList.clear();mocked方法将引发异常。

或者,您可以计算调用方法的次数,下面是一个如何执行该操作的小示例:

1
verify(mockedList, times(1)).clear();