Документация EasyMock является довольно четкой это
Поведение для этих трех методов объекта равняется (), хэш-код () и toString () не может быть изменен для Фиктивных объектов, созданных с EasyMock, даже если они - часть интерфейса, для которого создается Фиктивный объект.
Код, что я пытаюсь протестировать использование, равняется () для сравнения моего фиктивного объекта с чем-то еще. Я хотел бы сделать что-то как
expect(mock.equals(obj)).andReturn(false);
Когда я делаю это, я получаю IllegalStateException. Не удивительно там, учитывая то, что говорит документация.
У кого-либо есть какие-либо предложения для альтернативного подхода? Там другой путь состоит в том, чтобы управлять тем, что возвратит фиктивный объект, когда будет равняться (), назван на нем? Я предполагаю, что могу создать подкласс, который переопределения равняется ()
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 не позволяет Вам переопределить те методы объекта). Существует ли лучшее решение?
Многие из насмешливых библиотек не поддерживают это, потому что обычно это плохая идея. Если вы выполняете сравнение equals (), то у вас есть объект-значение, а не настоящий соавтор, и вам лучше использовать реальный экземпляр. Если вы используете equals () для представления какой-либо другой концепции (isBestFriendsWith (other)), вы можете заглушить ее, если это необходимо.