2017-11-29 6 views
0

メソッド呼び出しからリストを受け取るシナリオがあり、そのリストに正しい要素が含まれていると主張したいと思います。これを行う1つの方法は、どの要素をどれだけ詳細に見て、どの期待要素を比較するかを調べることです。名前。しかし、これらの要素には、ランダムに生成されたUUIDも含まれています。
そして、テストツールが私の救助になるかもしれないと思った。次の簡単な例を参照してください。いくつかのフィールドを無視してリストの内容をテストする

私はクラス犬を持っている:

public class Dog { 
    private String name; 
    private Integer age; 
} 

は、彼らがリストに含まれています

List<Dog> dogs = ... many dogs 

は、今私はリストが予想される犬が含まれていることをテストしたいが、何らかの理由で私がやりますフィールドのいくつかを知らない - ageと言う。 私はassertjとhamcrestの両方を使用しようとしましたが、フィールドのいくつかを無視しながら2つのリストを比較する正しい解決策を見つけることができません。

は今までこれは私が(hamcrestを使用)したものである:これは動作しますが、それは唯一のクラスの犬の2つのオブジェクトを比較し

List<Dog> actualDogs = codeUndertest.findDogs(new Owner("Basti")); 
List<Dog> expectedDogs = createExpectedListOfDogsWithoutTheAge(); 

Matcher.assertThat(actualDogs.get(0), Matcher.is(com.shazam.shazamcrest.matcher.Matchers 
    .sameBeanAs(expectedDogs.(0)) 
    .ignoring("age") 
)) 

。どのように私は2つのリストのすべての犬を比較するのですか?
ボーナスに関する質問:注文を知らずにリストを比較するにはどうすればよいですか、または期待される犬がリストに含まれていると主張するだけでよいのですか?

+0

をあなたが与えられた条件に対してオブジェクトを評価できるようになるこれは本当にクールなJavaライブラリがあります。私はこのユースケースには完璧だと思います。 https://github.com/apptreesoftware/Conditional –

+0

https://stackoverflow.com/questions/47133052/junit-assert-matchers-and-nested-objects – Ursache

答えて

1

はAssertJのusingElementComparatorIgnoringFieldsに試してみて:

Employee bill = new Employee("Bill", 60, "Micro$oft"); 
Employee appleBill = new Employee("Billie", 60, "Apple"); 
List<Employee> employees = newArrayList(bill, appleBill); 

Employees[] expectedEmployees = { new Employee("Bill", 60, "Google"), 
            new Employee("Billie", 60, "Facebook") }; 
// this assertion succeeds as we don't compare the company field.  
assertThat(employees).usingElementComparatorIgnoringFields("company") 
        .contains(expectedEmployees); 
+0

私のexpectedDogsが配列の場合、これをパラメータとしてcontainsに渡すことができます()。 – homaxto

関連する問題