当前位置: 首页 > 面试题库 >

如何断言列表中至少有n个大于x的项目(在junit中带有hamcrest)

唐俊英
2023-03-14
问题内容

我可以使用以下代码检查列表中是否包含大于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));
}

当然,这需要一些工作。而且不是很通用。但这有效。

另外,您可以在特定的测试方法中简单地“迭代”您的列表。



 类似资料:
  • 问题内容: 假设我有一个列表, 并且我想知道其中的至少一个数字是否存在于另一个列表中,例如这个列表: 换句话说,我想知道list中是否存在1,2或3 。我现在可以做类似的事情 但是,是否可能有一种方法可以使事情整齐? 问题答案: 有很多方法可以做到这一点。最直接的翻译是: 您还可以使用各种涉及集合的东西,例如: (这取决于元素是可哈希的,但如果这是真的,这很可能会更快地制定一套较大的出来的,并为任

  • 我试着 我在调试时获得和是。 如何在使用时断言大于条件

  • 问题内容: 以下问题特定于PySpark 1.5.0版,因为新功能不断添加到PySpark。 如何根据列的值列出列的所有项目?例如: 我想要类似的东西: 顺序无关紧要。在Pandas中,我可以通过以下方式来实现这一高贵的目标: 但是,版本1.5.0中的聚合功能似乎非常有限。任何想法如何克服此限制? 问题答案: 您可以使用Hive UDAF: 在1.6或更高版本中,可以使用collect_list函

  • 问题内容: 如何最好地编写Python函数()以有效测试元素()是否至少出现在列表()中几次? 我的第一个想法是: 但是,一旦发现次数,它就不会短路,并且始终为O(n)。 造成短路的简单方法是: 我也有一个带有发电机的更紧凑的短路解决方案: 还有其他好的解决方案吗?什么是最有效的方法? 谢谢 问题答案: 而不会造成额外的开销用的设置的对象,并使用具有测试 感实性 每一个项目,你可以使用推动发电机提

  • 问题内容: 我有两个清单说 现在,我想找出List2中是否存在List1的所有元素。在这种情况下,就全部存在。我不能使用子集函数,因为我可以在列表中重复元素。我可以使用for循环来计算List1中每个项目的出现次数,并查看它是否小于或等于List2中的出现次数。有一个更好的方法吗? 谢谢。 问题答案: 当出现次数无关紧要时,您仍可以通过动态创建集合来使用子集功能: 如果需要检查每个元素在第二个列表

  • 我正在从远程数据库读取一组行,从本地数据库读取一组类似的行,然后使用RemoveAll删除本地已经存在的远程行。。。 但这对我来说似乎不对。当我真正需要做的只是检查是否存在匹配项时,我认为我不应该计算事物。我尝试了和的各种用法,但得到了废话。我不能使用(如这里建议的),因为列表元素不是同一类型。 有更好的方法吗?