Вопрос
Предположим, что следующий простой тест:
@Test
public void test() throws Exception {
Object value = 1;
assertThat(value, greaterThan(0));
}
Тест не будет компилироваться, потому что "largeThan" может применяться только к экземплярам типа Comparable
. Но я хочу сказать, что value
- целое число, большее нуля. Как я могу выразить это с помощью Hamcrest?
То, что я пробовал до сих пор:
Простое решение состоит в том, чтобы просто удалить дженерики, наведя подобный подобный матчи:
assertThat(value, (Matcher)greaterThan(0));
Возможно, но генерирует предупреждение компилятора и чувствует себя не так.
Достаточная альтернатива:
@Test
public void testName() throws Exception {
Object value = 1;
assertThat(value, instanceOfAnd(Integer.class, greaterThan(0)));
}
private static<T> Matcher<Object> instanceOfAnd(final Class<T> clazz, final Matcher<? extends T> submatcher) {
return new BaseMatcher<Object>() {
@Override
public boolean matches(final Object item) {
return clazz.isInstance(item) && submatcher.matches(clazz.cast(item));
}
@Override
public void describeTo(final Description description) {
description
.appendText("is instanceof ")
.appendValue(clazz)
.appendText(" and ")
.appendDescriptionOf(submatcher);
}
@Override
public void describeMismatch(final Object item, final Description description) {
if (clazz.isInstance(item)) {
submatcher.describeMismatch(item, description);
} else {
description
.appendText("instanceof ")
.appendValue(item == null ? null : item.getClass());
}
}
};
}
Чувствует себя "аккуратным" и "правильным", но на самом деле это очень много кода для чего-то, что кажется простым. Я попытался найти что-то вроде встроенного в hamcrest, но я не увенчался успехом, но, может быть, я что-то пропустил?
Фон
В моем фактическом тестовом случае код выглядит следующим образом:
Map<String, Object> map = executeMethodUnderTest();
assertThat(map, hasEntry(equalTo("the number"), greaterThan(0)));
В моем упрощенном случае в вопросе я мог бы написать assertThat((Integer)value, greaterThan(0))
. В моем фактическом случае я мог написать assertThat((Integer)map.get("the number"), greaterThan(0)));
, но это, конечно, ухудшит сообщение об ошибке, если что-то не так.