Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅验证方法池中的特定交互_Java_Unit Testing_Mockito - Fatal编程技术网

Java 仅验证方法池中的特定交互

Java 仅验证方法池中的特定交互,java,unit-testing,mockito,Java,Unit Testing,Mockito,我目前正在编写黑盒测试,我必须使用Mockito验证方法池中的一个方法是否使用特定参数调用。是否调用了特定的方法并不重要,但必须调用其中一个方法。此外,如果调用了这些方法,我希望验证它们是否仅使用特定参数调用 在具体层面上: 我有一个类,它被模拟并注入我的黑匣子: class Mock { void option1(String arg1) void option2(String arg1, int arg2) void option3(String arg1, int

我目前正在编写黑盒测试,我必须使用Mockito验证方法池中的一个方法是否使用特定参数调用。是否调用了特定的方法并不重要,但必须调用其中一个方法。此外,如果调用了这些方法,我希望验证它们是否仅使用特定参数调用

在具体层面上:

我有一个类,它被模拟并注入我的黑匣子:

class Mock {
    void option1(String arg1)
    void option2(String arg1, int arg2)
    void option3(String arg1, int arg2, int arg3)
    void otherMethod()
}
在blackbox中,一个或多个“optionX”方法被调用一次或多次

现在我想验证至少有一个“optionX”方法是在黑盒中调用的,并且如果调用了任何“optionX”方法,则只使用特定参数调用它

当前的测试代码如下所示

Mock mock = spy(realObject);
blackbox.doBlackboxStuff(mock);

verify(mock, atLeast(1)).option1("Test");
verify(mock, atLeast(1)).option2("Test", 1);
verify(mock, atLeast(1)).option3("Test", 1, 2);
verifyNoMoreInteractions(mock);
像上面这样单独的“至少(1)个验证”将不起作用,因为这样每个方法都必须被调用。此外,我不能保证黑盒不会调用otherMethod(),因此即使我不关心otherMethod()调用,verifyNoMoreInteractions也会失败


有没有一种优雅的方法来解决这个问题(或者至少是一种方法)?

有一种方法有点老套,但应该有效:

MockingDetails details = Mockito.mockingDetails(mock);
Collection<Invocation> invocations = details.getInvocations();

for(Invocation invocation: invocations){
   if(CollectionUtils.isNotEmpty(invocation.getRawArguments()){
      return;
   }
}

fail();
MockingDetails=Mockito.MockingDetails(mock);
集合调用=details.getInvocations();
for(调用调用:调用){
if(CollectionUtils.isNotEmpty(invocation.getRawArguments()){
返回;
}
}
失败();
因此,基本上,如果至少一个调用包含测试通过的任何参数,则假设
otherMethod
没有示例中的参数


如果需要更多的定制,请参考:和

可能是您的所有方法
option1
..
option3
都调用了一些常用的帮助器方法。至少它们名称的相似性表明在功能上也可能有一些相似之处。现在,让我们假设它们都调用
帮助器
。然后,ins除了检查是否调用了任何
optionx
方法之外,您还可以检查是否调用了
helper

这是一种情况,此时您很可能需要更改代码,以便非常清楚发生了什么,或者根本不测试它。检查方法池中的方法是否已运行不是很有用。下面是什么要调用的每个方法的规则?为什么调用method1而不是method2?首先如何构建此方法池。如果没有明确的要求和期望,则不应为其编写“测试”。不幸的是,调用的常用方法是私有的。