6

EasyMock 文档非常清楚

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

我尝试测试的代码使用 equals() 将我的模拟对象与其他对象进行比较。我想做类似的事情

expect(mock.equals(obj)).andReturn(false);

当我这样做时,我得到一个 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);

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

4

2 回答 2

4

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

于 2010-06-10T20:43:31.510 回答
3

您无法更改 equals 的行为,但可以使用 Comparator 来实现自定义或部分比较。

然后您可以使用以下方法在 EasyMock 期望中使用比较器:

EasyMock.cmp

例如,如果您有一个 Person 类,其中包含一个名称和一个年龄实例变量,并且您只对比较名称感兴趣:

public class Person {
    String name;
    int age;

public boolean equals(Object obj) {
        // the equals method compares the name and the age, but we are interested only in                  
        // comparing the name
        // other not-null checks...
        Person other = (Person) obj;
        if (this.age != other.age) {
            return false;
        }
        if (other.name != null) {
            return false;
        }
        return true;
    }
}

public class PersonComparator implements Comparator<Person> {
        @Override
        public int compare(Person person1, Person person2) {
            //compare only the name
            if (person1.getName().equals(person2.getName())) {
                return 0;
            }
            return -1;
        }

}

并以这种方式使用 EasyMock.expect:

PersonComparator nameComparator = new PersonComparator();

Person person = new Person("Ana"); //the age doesn't matter

Person expectedPerson = EasyMock.cmp(comparisonPerson, nameComparator, LogicalOperator.EQUAL);

EasyMock.expect(personService.authenticate(expectedPerson)).andReturn(true);
于 2014-01-10T10:14:19.330 回答