Hamcrest: сравнение двух коллекций с пользовательским классом логически с помощью Hamcrest - PullRequest
0 голосов
/ 25 октября 2018

У меня два Collection<Dumb> Мне нужно сравнить с помощью подколенного сухожилия:

public class Dumb {
    private String id;

    //setters & getters
}

Коротко и просто,

@Test
public void test() {
    Collection<Dumb> actual = new ArrayList<Dumb>();
    Dumb actualDumbOne = new Dumb();
    actualDumbOne.setId("1");
    Dumb actualDumbTwo = new Dumb();
    actualDumbTwo.setId("2");
    actual.add(actualDumbOne);
    actual.add(actualDumbTwo);

    Collection<Dumb> expected = new ArrayList<Dumb>();
    Dumb expectedDumbOne = new Dumb();
    expectedDumbOne.setId("1");
    Dumb expectedDumbTwo = new Dumb();
    expectedDumbTwo.setId("2");
    expected.add(expectedDumbOne);
    expected.add(expectedDumbTwo);

    assertThat(expected, containsInAnyOrder(actual));
}

Сбой из-за:

Expected: iterable over [<[Dumb@56114349, Dumb@46c28400]>] in any order
     but: Not matched: <Dumb@2d6abfc7>

Важно : я не могу изменить Dumb код, это сторонний класс. Важно : мне нужно сравнить это Dumb.id is equals to Dumb.id.

Есть идеи?

1 Ответ

0 голосов
/ 25 октября 2018

Если вам нужно только сравнить членов Dumb.id, вы можете извлечь идентификаторы в список и сравнить полученный список идентификаторов.

    List<String> actualIds = actual.stream().map(Dumb::getId).collect(Collectors.toList());
    List<String> expectedIds = expected.stream().map(Dumb::getId).collect(Collectors.toList());

    assertThat(expectedIds, containsInAnyOrder(actualIds.toArray()));
...