org matchers examples equalto corematchers containsstring assertequals java junit hamcrest

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);