如何断言一个列表至少有 n 个大于 x 的项目(在 junit 中使用 hamcrest)
How to assert that a list has at least n items which are greater than x (with hamcrest in junit)
我可以用下面的代码检查列表是否有大于 30 的项目。
//Using Hamcrest
List<Integer> ints= Arrays.asList(22,33,44,55);
assertThat(ints,hasItem(greaterThan(30)));
但是,如果一个列表至少有 2 个大于 30 的项目,我该如何断言?
有了AssertJ
,我知道有一个解决办法。但我不知道如何用 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);
您可以创建自己的特定匹配器,例如:
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;
}
};
}
}
然后像这样使用它:
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));
}
当然,这有点工作;而且不是很通用。但它有效。
或者,您可以简单地 "iterate" 您的特定测试方法中的列表。
另一种简单的测试方法是
assertTrue(ints.size() >= 3);
我可以用下面的代码检查列表是否有大于 30 的项目。
//Using Hamcrest
List<Integer> ints= Arrays.asList(22,33,44,55);
assertThat(ints,hasItem(greaterThan(30)));
但是,如果一个列表至少有 2 个大于 30 的项目,我该如何断言?
有了AssertJ
,我知道有一个解决办法。但我不知道如何用 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);
您可以创建自己的特定匹配器,例如:
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;
}
};
}
}
然后像这样使用它:
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));
}
当然,这有点工作;而且不是很通用。但它有效。
或者,您可以简单地 "iterate" 您的特定测试方法中的列表。
另一种简单的测试方法是
assertTrue(ints.size() >= 3);