Mockito如何验证条件?

时间:2014-08-26 16:35:12

标签: java unit-testing mockito

所以我想验证Mockito的方法。

Subject subject = loadSubject(); 
Teacher teacher = loadTeacher();
Mockito.verify( exam ).createExam( subject , teacher );

但是如果这个条件成立,我想验证这个方法:

subject.name.equals("Math") && subject.complexity == 10

那么如何向Mockito验证添加条件?

2 个答案:

答案 0 :(得分:2)

根据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);
}

我希望它有所帮助。

答案 1 :(得分:0)

这是一个旧帖子,但我发现你可以有条件地验证。我的情况是,我想验证一个方法是否在我的模拟/间谍上被调用,如果另一个方法(实际实现)也被调用。我能够通过使用设置布尔值然后调用真实方法的自定义 doAnswer 来做到这一点。在下面的示例中,验证 doSkip 是否被调用,如果 readName 被调用。

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();
}