EasyMock - 改变equals()和其他Object方法的行为

Ed *_*ner 6 java easymock equals

EasyMock文档很清楚

对于使用EasyMock创建的模拟对象,无法更改三个对象方法equals(),hashCode()和toString()的行为,即使它们是创建模拟对象的接口的一部分.

我正在尝试测试的代码使用equals()来比较我的模拟对象.我想做点什么

expect(mock.equals(obj)).andReturn(false);
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到一个IllegalStateException.鉴于文档说的内容,这并不奇怪.

有没有人对替代方法有任何建议?还有另一种方法可以控制模拟对象在调用equals()时返回的内容吗?我想我可以创建一个覆盖equals()的子类

class FooImplOverrideEquals extends FooImpl {
    public boolean equals;
    public boolean equals(Object obj) { return equals; }
}
FooImplOverrideEquals mock = createMock(FooImplOverrideEquals.class);
mock.equals = false; // instead of expect(mock.equals(obj)).andReturn(false);
Run Code Online (Sandbox Code Playgroud)

但这似乎不够优雅.我觉得我缺少一些重要的东西(比如EasyMock不允许你覆盖那些对象方法的原因).有更好的解决方案吗?

Ste*_*man 4

许多模拟库不支持这一点,因为这通常是一个坏主意。如果您正在进行 equals() 比较,那么您拥有一个值对象,而不是真正的协作者,并且最好使用真实实例。如果您使用 equals() 来表示其他一些概念 (isBestFriendsWith(other)),那么您可以在适当的情况下对其进行存根。