Java Mockito如何验证条件?

Java Mockito如何验证条件?,java,unit-testing,mockito,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验证添加条件呢

所以我想用Mockito验证一个方法

Subject subject = loadSubject(); 
Teacher teacher = loadTeacher();
Mockito.verify( exam ).createExam( subject , teacher );
但是如果这个条件是真的,我想验证这个方法:

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

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

根据Mockito的文档,无法指定条件

根据您发布的一小段代码,我猜您希望执行一个条件调用,Mockito然后按照文档中的说明注册所有交互

一旦创建,mock将记住所有交互。然后,您可以有选择地验证您感兴趣的任何交互

所以

例如,您必须在某个地方插入条件块

@Test
public void testExamCreation() throws Exception {
    if(subject.getName().equalsIgnoreCase("Math") && subject.getComplexity() == 10) {
        mockedExam.createExam(subject, teacher);
    }
    verify(mockedExam).createExam(subject, teacher);
}

我希望能有所帮助。

这是一篇老文章,但我发现你可以有条件地验证。在我的例子中,我想验证只有在调用了另一个方法(实际实现)的情况下才在mock/spy上调用了一个方法。我可以通过使用一个自定义的doAnswer来实现这一点,该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();
}

假设您可以控制
loadSubject()
,则需要创建Subject对象,其名称为“Math”,复杂性为10,后面是verify调用。您不能将verify()调用包装在if()块中吗?对不起,可能我写得不太清楚。现在我找到了解决方案,它是:私有静态类匹配器扩展ArgumentMatcher{public boolean matches(Subject sub){return sub.getName().equals(“Math”)&&sub.getComplexity()==10;}}对不起,也许我写得不太清楚。现在我找到了解决方案,它是:私有静态类Matcher扩展ArgumentMatcher{public boolean matches(Subject sub){return sub.getName().equals(“Math”)&&sub.getComplexity()==10;}
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();
}