Для класса параметрасообщение Неудачный тест для Mockito проверить
class Criteria {
private Map params;
public getMap(){ return params; }
}
и метод обслуживания принять этот критерий
class Service{
public List<Person> query(Criteria criteria){ ... }
}
Обычай featureMatcher используется, чтобы соответствовать критериям ключевых
private Matcher<Criteria> hasCriteria(final String key, final Matcher<?> valueMatcher){
return new FeatureMatcher<Criteria, Object>((Matcher<? super Object>)valueMatcher, key, key){
@Override protected Object featureValueOf(Criteria actual){
return actual.getMap().get(key);
}
}
}
при использовании mockito для уточнения аргументов:
verify(Service).query((Criteria) argThat("id", hasCriteria("id", equalTo(new Long(12)))));
Сообщение об ошибке показывает, что:
Argument(s) are different! Wanted:
Service.query(
id <12L>
);
-> at app.TestTarget.test_id (TestTarget.java:134)
Actual invocation has different arguments:
Service.query(
[email protected]
);
Если я использую ArugmentCaptor
,
ArgumentCaptor<Criteria> argument = ArgumentCaptor.forClass(Criteria.class);
verify(Service).query(argument.capture());
assertThat(argument.getValue(), hasCriteria("id", equalTo(new Long(12))));
Сообщение гораздо лучше:
Expected: id <12L> but id was <2L>
Как я могу получить такое сообщение, без использования ArgumentCaptor
?
Боковое примечание: 'new Long (12)' неэффективно, потому что вы пропускаете [кэш небольших целых чисел] VM (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/ OpenJDK/6-B14/Java/языки/Long.java # 547). Предпочитайте 'Long.valueOf (12L)' вместо этого или дайте автозагрузку Java для вас с '(Long) 12L'. –