对 mockito 间谍对象进行断言是否有效?

Would it be valid to assert on mockito spyed object?

我正在监视这样一个对象:

@Spy
@InjectMocks
private final A a= new A()

在测试用例中,我对 A 对象的属性进行断言。 由于监视一个对象意味着调用真正的方法,断言被监视对象的属性是否正确?

从技术上讲它会起作用,但我建议不要这样做,模拟值对象通常不是一个好主意(甚至是反模式)。

  • 如果测试是为了验证属性是否已更改为特定值,那么此对象就是被测试的对象,因此没有理由将其作为间谍。
  • 如果使用当前的 API 创建一个简单的值对象太困难,那么测试代码中存在可用性问题,需要重构或实用程序才能轻松创建有效实例。

只有在一些非常特殊的边缘情况下,才需要 @Spy@InjectMocks 的组合。 大多数时候不需要,并且此类测试显示测试代码中存在设计问题。

相反,只需创建一个真实的对象,在需要时注入模拟并直接在测试对象上断言属性。一个好的间谍用法是验证两个 协作 对象之间是否存在交互。