Mockito可以检测模拟使用和字段分配吗?

时间:2017-06-26 04:09:59

标签: unit-testing mocking mockito

测试可能最好地解释了这个用例:

@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方法?

1 个答案:

答案 0 :(得分:2)

OO是关于行为,而不是状态

Mockito documentation中第一段的内容是:

  

让我们验证一些行为! ...

从这个意义上说;当Mockito谈论交互时,他们(或我认识的任何其他模拟框架)的意思是:方法调用。

换句话说:模拟对象知道 nothing 关于它正在模拟的类的字段。

所以,你基本上可以做到以下几点:

  1. 保持您当前的testZeroInteraction()测试(以证明没有方法被调用)
  2. 添加第二个测试,以检查实际输入对象是否无法更改
  3. 像:

    @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 应该做你正在做的事情。所以,正如所说:这里的真正的答案是修复你破碎的设计。