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中提到了这一点。