我想测试我类(class)的 equals() 方法,但 Mockito 似乎每次都在调用 stub 版本。我的测试如下;
PluginResourceAdapter adapter = mock (PluginResourceAdapter.class);
PluginResourceAdapter other = mock (PluginResourceAdapter.class);
when(adapter.getNumberOfEndpointActivation()).thenReturn(1);
when(other.getNumberOfEndpointActivation()).thenReturn(0);
boolean result = adapter.equals(other);
assertFalse(result);
我知道我不能 stub equals 方法,这意味着 Mockito 应该调用我的真正实现,但它不是。
我也试过这个:
when (adapter.equals(any()).thenCallRealMethod()
但我得到了同样的结果。
最佳答案
甚至超出Mockito's limitations , 模拟对象使用真实的 equals
没有多大意义方法,如果没有其他原因,等于方法几乎总是使用字段,并且模拟对象从不运行它们的任何构造函数或字段初始值设定项。
另外,请注意您正在测试的内容:在 Foo
的测试中, 理想情况下你不应该 mock Foo
,甚至设置一个Foo
比较。否则,很容易在不经意间测试 Mockito 是否有效,而不是测试您自己组件的逻辑。
您有一些解决方法:
equals
和 hashCode
. equivalentTo
方法,与 equals
不同(例如,因此对 Map 或 Set 对象没有那么有用)但它具有可模拟的语义,您可以自己定义。这也可以让您测试
equivalentTo
自由地模拟,只需拥有equals
委托(delegate)给那个可能经过良好测试的实现。 Equivalence
那里,或 Comparator
你在哪里测试a.compareTo(b) == 0
.class YourClass {
class AdapterEquivalence {
boolean adaptersAreEqual(
PluginResourceAdapter a, PluginResourceAdapter b) {
return a.equals(b);
}
}
/** Visible for testing. Replace in tests. */
AdapterEquivalence adapterEquivalence = new AdapterEquivalence();
}
请注意,另一种可能的解决方法— spying on existing instances ——也会redefine
equals
and hashCode
并且不会在这里帮助你。
关于methods - 防止equals方法的 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19778592/