所以我想验证Mockito的一个方法。
Subject subject = loadSubject();
Teacher teacher = loadTeacher();
Mockito.verify( exam ).createExam( subject , teacher );
但如果这个条件是真的,我想验证这个方法:
subject.name.equals("Math") && subject.complexity == 10
那么,我如何为Mockito验证添加条件呢?
根据Mockito的文档,没有办法指定条件http://goo.gl/23fYi
从你发布的一小段代码来看,我想你想做一个条件调用,Mockito然后按照文档中的说明注册所有交互
一旦创建,mock将记住所有交互。然后你可以有选择地验证你感兴趣的任何交互
所以
Exam mockedExam = mock(Exam.class);
mockedExam.createExam(subject, teacher);
verify(mockedExam).createExam(subject, teacher);
你必须在某个地方插入条件块,例如
@Test
public void testExamCreation() throws Exception {
if(subject.getName().equalsIgnoreCase("Math") && subject.getComplexity() == 10) {
mockedExam.createExam(subject, teacher);
}
verify(mockedExam).createExam(subject, teacher);
}
我希望它能有所帮助。
我遇到了同样的问题:MockitoArgumentCaptor可能就是您想要的,这里有一个很好的例子:https://www.baeldung.com/mockito-argumentcaptor
这是一篇旧文章,但我发现您可以有条件地验证。在我的情况下,我想验证在我的mock/spy上调用了一个方法,前提是也调用了另一个方法(实际实现)。我可以通过使用自定义doAnswer来实现这一点,它设置了一个布尔值,然后调用real方法。在下面的示例中,验证如果调用readName
,则doSkip
是否被调用。
final BsonDocumentReader reader = spy(new BsonDocumentReader(document));
final AtomicBoolean readNameCalled = new AtomicBoolean(false);
doAnswer(invocation -> {
readNameCalled.set(true);
return invocation.callRealMethod();
}).when(reader).readName();
if (readNameCalled.get()) {
verify(reader).skipValue();
}