【问题标题】:Mockito spy: also spy on members?Mockito 间谍:也监视成员?
【发布时间】:2016-06-08 18:42:45
【问题描述】:

当我监视一个班级时,它是否也会监视该班级的所有成员?例如,假设我正在创建一个 Pair 类,并测试 toString 的实现(不是有史以来最好的例子)。

public class Pair<L,R> {
    L left;
    R right;
    // ... getters setters etc
    public String toString() {
        return "(" + getLeft() + ", " + getRight() + ")";
    }
}

假设我要确保左右它们的 toString 都被调用。

@Test
public void testToString() {
    classUnderTest = spy(new Pair<>(...));
    String str = classUnderTest.toString();

    verify(classUnderTest.getLeft()).toString(); // does it actually verify?
    verify(classUnderTest.getRight()).toString();
}

【问题讨论】:

  • 测试时会发生什么?在你做之前阅读:github.com/mockito/mockito/wiki/FAQ#can-i-verify-tostring
  • @Compass 不,它是正确的。
  • @JBNizet - 他们确实通过了。在阅读了更多内容之后,这看起来意味着它的行为符合预期——如果你没有向它传递一个模拟/间谍,我不知道验证失败。这里的 toString 只是一个例子,我的真实代码是不同的。
  • 不,他们没有通过。如果他们这样做,那么您没有正确测试它。发布一个完整的最小示例来复制它。

标签: java mockito


【解决方案1】:

您无法验证toString() 方法调用。详情请见documentation

但是,如果您想确保在调用 toString() 时,会调用方法 getLeft()getRight,您可以编写如下内容:

@Test
    public void whenPrintingPairBothPartsAreRequested() {
        Pair<String, Integer> pair = new Pair<>();
        pair = spy(pair);

        verify(pair).getLeft();
        verify(pair).getRight();
    }

编辑:不,监视一个对象不会监视它的所有成员,除非您将对象的成员显式设置为间谍。

它在您的示例中运行良好的原因只是巧合。

当您编写 verify(pair.getLeft()).toString() 时,它实际上等于 verify(pair.getLeft())(因此,toString() 将被忽略)。但不要混淆:它不是 pair 对象上的 toString()。它是 pair 对象内的那个 Left 对象的 toString()

public static &lt;T&gt; T verify(T mock) - 是验证方法的签名。 因此,如果您正在验证verify(pair.getLeft()),则将返回pair.getLeft()。然后再调用toString()就可以了,不会影响测试结果。

【讨论】:

  • 显然 toString 是一个不好的例子。我的真实代码不是在测试 toString,而是在转换所有者时,成员拥有自己的转换器方法。
猜你喜欢
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多