java - matchers - Cómo afirmar que una lista tiene al menos n elementos que son mayores que x(con hamcrest en junit)
hamcrest matchers (1)
Puede crear su propio matcher específico, como:
class ListMatcher {
public static Matcher<List<Integer>> hasAtLeastItemsGreaterThan(final int targetCount, final int lowerLimit) {
return new TypeSafeMatcher<List<Integer>>() {
@Override
public void describeTo(final Description description) {
description.appendText("should have at least " + targetCount + " items greater than " + lowerLimit);
}
@Override
public void describeMismatchSafely(final List<Integer> arg0, final Description mismatchDescription) {
mismatchDescription.appendText("was ").appendValue(arg0.toString());
}
@Override
protected boolean matchesSafely(List<Integer> values) {
int actualCount = 0;
for (int value : values) {
if (value > lowerLimit) {
actualCount++;
}
}
return actualCount >= targetCount;
}
};
}
}
Y luego úsalo como:
public class ListMatcherTests {
@Test
public void testListMatcherPasses() {
List<Integer> underTest = Arrays.asList(1, 10, 20);
assertThat(underTest, ListMatcher.hasAtLeastItemsGreaterThan(2, 5));
}
@Test
public void testListMatcherFails() {
List<Integer> underTest = Arrays.asList(1, 10, 20);
assertThat(underTest, ListMatcher.hasAtLeastItemsGreaterThan(2, 15));
}
Por supuesto, esto es un poco de trabajo; y no muy genérico Pero funciona.
Alternativamente, podría simplemente "iterar" su lista dentro de su método de prueba específico.
Podría con el código siguiente verificar si una lista tiene un elemento, que es mayor que 30.
//Using Hamcrest
List<Integer> ints= Arrays.asList(22,33,44,55);
assertThat(ints,hasItem(greaterThan(30)));
Pero, ¿cómo podría afirmar si una lista tiene al menos 2 elementos, que son más de 30?
Con AssertJ
, hay una solución que conozco. Pero no tengo idea de cómo darme cuenta de eso con Hamcrest
.
//Using AssertJ
List<Integer> ints= Arrays.asList(22,33,44,55);
Condition<Integer> greaterThanCondition = new Condition<Integer>("greater") {
@Override
public boolean matches (Integer i){
return i>30;
}
} ;
assertThat(ints).haveatLeast(2,greaterThanCondition);