Mockito间谍:还会窥探会员?

时间:2016-06-08 18:42:45

标签: java mockito

当我监视某个班级时,它是否也监视该班级中的所有成员?例如,假设我正在创建一个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();
}

1 个答案:

答案 0 :(得分:0)

您无法验证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())的eq(因此,toString()将被忽略)。但不要感到困惑:对象对象上没有toString()。它是对象内部的Left对象的toString()

public static <T> T verify(T mock) - 是验证方法的标志。 因此,如果您要验证verify(pair.getLeft()),则会返回pair.getLeft()。在那之后,你打电话给toString(),这对测试结果毫无用处,也没有影响。