测试可能最好地解释了这个用例:
@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方法?
答案 0 :(得分:2)
OO是关于行为,而不是状态。
Mockito documentation中第一段的内容是:
让我们验证一些行为! ...
从这个意义上说;当Mockito谈论交互时,他们(或我认识的任何其他模拟框架)的意思是:方法调用。
换句话说:模拟对象知道 nothing 关于它正在模拟的类的字段。
所以,你基本上可以做到以下几点:
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));
}
这个测试"意味着":创建一个教练对象,然后创建一个副本。将第一个对象传递给您的方法;然后检查该对象是否仍然是equals
副本。
但当然 - 这需要你有某种"复制构造函数&#34 ;;以及equals()
的合理实施。
最后:你应该从踩回来开始。我的第一句话是:" OO是关于行为,而不是状态"。转换为:使用公共可写字段的培训师课程的想法是设计气味。你不应该这样做。您不会创建对象,传递它们并让其他代码直接写入字段。你在其他对象上调用方法,你就不会操纵他们的状态。
换句话说:您的方法违反了一整套重要的面向对象原则。因此,Mockito不支持你在做什么。因为 nobody 应该做你正在做的事情。所以,正如所说:这里的真正的答案是修复你破碎的设计。