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 莫基托';s ArgumentCaptor:一个方法名,两个方法定义_Java_Unit Testing_Mockito - Fatal编程技术网

Java 莫基托';s ArgumentCaptor:一个方法名,两个方法定义

Java 莫基托';s ArgumentCaptor:一个方法名,两个方法定义,java,unit-testing,mockito,Java,Unit Testing,Mockito,我正在尝试编写一个测试来验证可以接受两个不同参数的相同方法名的调用。我最初尝试的代码片段: ArgumentCaptor<Label> labelCaptor = ArgumentCaptor.forClass(Label.class); Mockito.verify(fakeSheet, Mockito.times(4)).addCell(labelCaptor.capture()); ArgumentCaptor<Number> numberCaptor = Arg

我正在尝试编写一个测试来验证可以接受两个不同参数的相同方法名的调用。我最初尝试的代码片段:

ArgumentCaptor<Label> labelCaptor = ArgumentCaptor.forClass(Label.class);
Mockito.verify(fakeSheet, Mockito.times(4)).addCell(labelCaptor.capture());

ArgumentCaptor<Number> numberCaptor = ArgumentCaptor.forClass(Number.class);
Mockito.verify(fakeSheet, Mockito.times(2)).addCell(numberCaptor.capture());
ArgumentCaptor labelCaptor=ArgumentCaptor.forClass(Label.class);
Mockito.verify(fakeSheet,Mockito.times(4)).addCell(labelCaptor.capture());
ArgumentCaptor numberCaptor=ArgumentCaptor.forClass(Number.class);
验证(fakeSheet,Mockito.times(2)).addCell(numbercator.capture());
然而,Mockito抱怨addCell在第一次验证时运行了6次。所以,我试过这个:

ArgumentCaptor<Label> labelCaptor = ArgumentCaptor.forClass(Label.class);
Mockito.verify(fakeSheet, Mockito.times(6)).addCell(labelCaptor.capture());

ArgumentCaptor<Number> numberCaptor = ArgumentCaptor.forClass(Number.class);
Mockito.verify(fakeSheet, Mockito.times(6)).addCell(numberCaptor.capture());
ArgumentCaptor labelCaptor=ArgumentCaptor.forClass(Label.class);
验证(fakeSheet,Mockito.times(6)).addCell(labelCaptor.capture());
ArgumentCaptor numberCaptor=ArgumentCaptor.forClass(Number.class);
验证(fakeSheet,Mockito.times(6)).addCell(numbercator.capture());
它会运行,但会在两个ArgumentCaptor中为我提供所有6个参数调用,将我期望的所有6个对象的信息存储到两个ArgumentCaptor实例中


这感觉非常错误-当然,我可以用它编写一个测试,但是我的捕获者没有区分这两个类的事实让我感觉很肮脏。有没有办法让Mockito区分这两者?

它是否与
Mockito.verify(fakeSheet,Mockito.times(4)).addCell(Matchers.any(Label.class))
Mockito.verify(fakeSheet,Mockito.times(4)).addCell(Matchers.any(Number.class))
Label
Number
在同一个继承树中吗?啊,我试过了,这暴露了我对库的误解。这两种类型确实共享父类,但出于某种原因,我认为在挖掘时,我看到了每种类型的特定方法签名,但事实证明并非如此。这可以解释我的问题,谢谢!所以只需执行
Mockito.verify(fakeSheet,Mockito.times(6)).addCell(commonCaptor.capture())
然后检查
commonCaptor.getAllValues()
列表是否包含4个标签和2个数字。在这两种验证方法之间,只需重置模拟,它就应该按原样工作。请注意
any
不执行类型检查(因为它代表任何内容),而且
ArgumentCaptor
也不执行,类arg在这里是为了避免强制转换。javadoc中提到了这一点。