How to claim that a list has at least n elements that are greater than x (with hamcrest in junit)

I could with the following code check if there is an item in the list that is greater than 30.

//Using Hamcrest List<Integer> ints= Arrays.asList(22,33,44,55); assertThat(ints,hasItem(greaterThan(30))); 

But how can I say that there are at least 2 elements in the list that are more than 30?

With AssertJ , there is a solution that I know. But I have no idea how to implement this with 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); 
+2
source share
1 answer

You can create your own special assistant, for example:

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

And then use it like:

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

Of course, this is a little work; and not very general. But it works.

Alternatively, you can simply iterate over your list as part of your specific testing method.

+1
source

Source: https://habr.com/ru/post/1258606/


All Articles