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

Jar*_*rek 17 java testing mocking mockito

我遇到了一个问题,我找不到一个优雅的解决方案.

所以问题是模拟Selenium web驱动程序,我不知道我应该如何测试/模拟void方法.

public void clickAndWait(String locator) {
    if(isElementPresent(locator) == false) throw some exception;
    selenium.clickAndWait(); //a problematic delegating call to selenium
}
Run Code Online (Sandbox Code Playgroud)

所以我要问的是,如何正确测试这样的方法,一个测试将被抛出异常,但是如何正确地测试我委托给的void方法?

hoi*_*loi 31

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

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

// following throws RuntimeException:
mockedList.clear();
Run Code Online (Sandbox Code Playgroud)


Mar*_*ski 21

doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {

            return null;
        }
    }).when(mock).method((SomeClass) anyObject());
Run Code Online (Sandbox Code Playgroud)


Sou*_*abh 10

之前的答案一直强调在每次通话时做某事(可能抛出异常).这样你做的事情如下:

doThrow(new RuntimeException()).when(mockedList).clear();
Run Code Online (Sandbox Code Playgroud)

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

mockedList.clear();
Run Code Online (Sandbox Code Playgroud)

它会产生一个例外.如果你想测试方法的正确功能怎么办可能会写出积极的测试用例.对这种情况进行模拟返回的方法可以通过以下方式完成:

doNothing().when(mockedList).clear();
Run Code Online (Sandbox Code Playgroud)

这意味着,由于您存储clear()了mockedListmock 的方法,您可以确定此方法不会影响单元的逻辑,仍然可以检查流的其余部分而不会生成异常.