测试可能最好地解释了这种用例:
@Test
public void testZeroInteraction() {
Pika pika = new Pika();
Trainer trainer=mock(Trainer.class);
pika.doNothing3(trainer);
verifyZeroInteractions(trainer);
}
这是我在
doNothing3()
类中的Pika
方法:void doNothing3(Trainer trainerIn){
trainer=trainerIn;
trainerIn.name="Ash";
}
在这种情况下,
verifyZeroInteractions()
不会抱怨,并且测试通过。Mockito是否可以像上面的
doNothing3
方法中那样检测分配?如果是这样,可以使用哪种Mockito方法?
最佳答案
OO是关于行为,而不是状态。
在Mockito documentation的第一段右边显示:
让我们验证一些行为! ...
从这个意义上说;当Mockito谈论交互时,它们(或据我所知的任何其他模拟框架)的意思是:方法调用。
换句话说:模拟的对象对它正在模拟的类的字段一无所知。
因此,您基本上可以执行以下操作:
testZeroInteraction()
测试(以证明没有调用方法)喜欢:
@Test
public void testFieldUpdates() {
Pika pika = new Pika();
Trainer orig = new Trainer();
Trainer copy = new Trainer(orig);
pika.doNothing3(copy);
assertThat(orig, is(copy));
}
该测试的“含义”是:创建一个Trainer对象,然后创建该对象的副本。将第一个对象传递到您的方法中;然后检查该对象是否仍对副本进行
equals
。但是,当然-这需要您拥有某种“复制构造函数”;以及
equals()
的合理实现。最后:您实际上应该先后退。我的第一句话是:“OO是关于行为,而不是状态”。转换为:具有 public 可写字段的Trainer类的想法是设计气味。你不应该那样做。您无需创建对象,将它们传递给其他对象,而让其他代码直接写入字段。您可以在其他对象上调用方法,而无需操纵它们的状态。
换句话说:您的方法违反了一整套重要的面向对象原则。因此,Mockito不支持您的工作。因为没有人应该做您正在做的事情。因此,如前所述:真正的答案是修复损坏的设计。
关于unit-testing - Mockito可以检测模拟使用情况和字段分配吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44752996/