При тестировании Set
с помощью JUnit и сопоставителей Hamcrest я заметил этот метод Matchers.contains()
дает довольно хорошее представление о том, что не так с тестом. С другой стороны, отчет о различиях Matchers.containsInAnyOrder()
практически бесполезен. Вот тестовый код:
Простой компонент:
public class MyBean {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
Тест JUnit:
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
public class MyTest {
@Test
public void hamcrestTest() {
Set<MyBean> beanSet = new HashSet<MyBean>();
MyBean bean = new MyBean();
bean.setId(1);
beanSet.add(bean);
bean = new MyBean();
bean.setId(2);
beanSet.add(bean);
assertThat(beanSet, contains(
hasProperty("id", is(1)),
hasProperty("id", is(3))
));
}
}
Как вы можете видеть, фактические идентификаторы компонентов — 1
и 2
, а ожидаемые — 1
и 3
, поэтому тест не пройден.
Результат проверки:
java.lang.AssertionError:
Expected: iterable over [hasProperty("id", is <1>), hasProperty("id", is <3>)] in any order
but: Not matched: <MyBean@4888884e
Если я переключусь на метод Matchers.contains()
, результат будет намного информативнее:
java.lang.AssertionError:
Expected: iterable containing [hasProperty("id", is <1>), hasProperty("id", is <3>)]
but: item 0: property 'id' was <2>
К сожалению, поскольку набор не заказан, contains()
в данном случае не подходит.
Наконец, вопрос:
Можно ли каким-то образом получить лучший отчет об ошибке при утверждении Set
с подколенным сухожилием?