テスト目的のみのためにequals()
とhashCode()
を実装することは、コードの匂いです。私はHamcrestライブラリを使用していませんので、私は自分のプロジェクトでうまく使用するカスタムソリューションを提供し、その使用法については私はそれに非常に満足しています。あなたが見ることができるように
public static <E, A> void assertListEquals(BiConsumer<E, A> asserter, List<E> expected, List<A> actual) throws AssertionError {
assertEquals(
"Lists have different sizes. Expected list: " + expected + ", actual list: " + actual,
expected.size(),
actual.size());
for (int i = 0; i < expected.size(); i++) {
try {
asserter.accept(expected.get(i), actual.get(i));
} catch (AssertionError e) {
throw e;
}
}
}
は、BiConsumerは、2つのオブジェクトの等価性をチェックするためのロジックを適用するために使用されています。したがって、このクラスはテストクラスで実装する必要があります。その利点は、2つのオブジェクトを比較するときに興味のあるクラスのフィールドを定義できることです。
使用方法は次のとおりです。 まず、カスタムクラスf.e.があります。:私はテスト(およびTDD)の大ファンですので、私はいつも私のヘルパーメソッドを作るので、私はいつもテストのトンを書く
@Test
public void peopleLiveInTheVillage_findPeople_peopleAreFound() throws Exception {
//Arrange
List<Person> expectedPeople = Arrays.asList(
new Person("Lewis", "Smith", 20),
new Person("Steven", "Richard", 25),
new Person("Richie", "Rich", 30));
//Act
List<Person> actualPeople = sut.findPeople();
//Assert
assertListEquals(
(e, a) -> assertPersonEquals(e, a),
expectedPeople,
actualPeople);
}
private void assertPersonEquals(Person expected, Person actual) {
assertEquals(expected.getFirstName(), actual.getFirstName());
assertEquals(expected.getLastName(), actual.getLastName());
assertEquals(expected.getAge(), actual.getAge());
}
:人
public class Person {
private String firstName;
private String lastName;
private int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
}
は、その後の試験方法を見ることができますBiConsumerをラップしてください:
private void assertPeopleEqual(List<Person> expectedPeople, List<Person> actualPeople) throws AssertionError {
assertListEquals(
(e, a) -> assertPersonEqual(e, a),
expectedPeople,
actualPeople);
}
私はこれがうまくいったら賞賛します!
私は、 'Matcher'の' matchesSafely'メソッドで 'ReflectionEquals'を使用できない理由はないと付け加えたいと思います –