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

@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/

    10-14 02:46