EasyMock - изменение поведения для equals () и других методов Object - PullRequest
6 голосов
/ 09 июня 2010

Документация EasyMock довольно ясно показывает, что

Поведение для трех методов объекта equals (), hashCode () и toString () не может быть изменено для объектов Mock, созданных с помощью EasyMock, даже если ониявляются частью интерфейса, для которого создается Mock Object.

Код, который я пытаюсь протестировать, использует 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 не позволяет вам переопределять эти методы объекта).Есть ли лучшее решение?

Ответы [ 2 ]

4 голосов
/ 11 июня 2010

Многие из насмешливых библиотек не поддерживают это, потому что, как правило, это плохая идея. Если вы выполняете сравнение equals (), то у вас есть объект значения, а не реальный соавтор, и вам лучше использовать реальный экземпляр. Если вы используете equals () для представления какой-либо другой концепции (isBestFriendsWith (other)), то при необходимости вы можете заглушить ее.

3 голосов
/ 10 января 2014

Вы не можете изменить поведение равных, но вы можете использовать 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);
...