6

EasyMockのドキュメントは非常に明確です

3つのオブジェクトメソッドequals()、hashCode()、およびtoString()の動作は、モックオブジェクトが作成されたインターフェイスの一部であっても、EasyMockで作成されたモックオブジェクトでは変更できません。

私がテストしようとしているコードは、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 に答える