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

Java 如何在Mockito中模拟/测试返回void的方法,java,testing,mocking,mockito,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 }

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

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

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

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

下面的代码示例演示了如何模拟void方法:

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

// following throws RuntimeException:
mockedList.clear();
doAnswer(新答案(){
@凌驾
公共Void应答(invocationmock调用)抛出可丢弃的{
返回null;
}
}).when(mock).method((SomeClass)anyObject());
您还可以使用:

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

您可以在方法调用中抛出异常,下面是一个小示例:

doThrow(new RuntimeException()).when(mockedList).clear();
然后调用
mockedList.clear()模拟方法将引发异常

或者您可以计算方法被调用的次数,下面是一个小示例:

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

前面的答案强调在每次通话中都要做些什么(可能抛出异常)。这样,当您执行以下操作时:

doThrow(new RuntimeException()).when(mockedList).clear();
然后调用存根服务(或逻辑),如:

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

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

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

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

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

返回null
非常重要,如果没有它,编译将失败,并出现一些相当模糊的错误,因为出于好奇,它无法为
doAnswer

找到合适的覆盖,为什么要为集成测试编写单元测试?可能是+1有用答案的重复,该答案显示了当方法采用参数时如何使用doThrow/doAnswer/etc,即使用
anyObject()
进行转换。嗨,Marcin,我试着给出了相同的答案,并得到了中提到的错误。你能看一下吗?嗨,Sourabh,我尝试了相同的解决方案,得到了中提到的异常,您能看一下吗?Mockito文档链接现在不可用:(
doNothing().when(mockedList).clear();
doAnswer((i) -> {
  // Do stuff with i.getArguments() here
  return null;
}).when(*mock*).*method*(*methodArguments*);