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();
}

无法验证toString()方法调用。有关更多详细信息,请参阅文档。

但是,如果要确保在调用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()将被忽略)。但不要混淆:它不是toString()对对象。它是对对象中的 Left 对象的toString()

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

相关内容

  • 没有找到相关文章

最新更新