gpt4 book ai didi

java - assertThat - hamcrest - 检查列表是否排序

转载 作者:太空狗 更新时间:2023-10-29 22:42:26 24 4
gpt4 key购买 nike

好的,我认为这将是一个简短的问题。我有一个按日期排序的 ArrayList,当然我看到它有效,但我也想为它编写一个测试。

我想检查列表中的下一个值(日期)是否低于前一个值。我可以通过使用一些 for 并添加临时列表来做到这一点,但我想知道是否有更简单的解决方案。我在 hamrest 文档中读到,有类似 contains(hamrest contains)这样的想法可以遍历一个对象(列表、 map 等),但我仍然不知道下一步该做什么。

最佳答案

[第一种选择]:您可以编写自己的匹配器。类似(免责声明:这只是示例代码,未经测试,可能并不完美):

@Test
public void theArrayIsInDescendingOrder() throws Exception
{
List<Integer> orderedList = new ArrayList<Integer>();
orderedList.add(10);
orderedList.add(5);
orderedList.add(1);
assertThat(orderedList, isInDescendingOrdering());
}

private Matcher<? super List<Integer>> isInDescendingOrdering()
{
return new TypeSafeMatcher<List<Integer>>()
{
@Override
public void describeTo (Description description)
{
description.appendText("describe the error has you like more");
}

@Override
protected boolean matchesSafely (List<Integer> item)
{
for(int i = 0 ; i < item.size() -1; i++) {
if(item.get(i) <= item.get(i+1)) return false;
}
return true;
}
};
}

此示例使用 Integer,但您可以轻松使用 Date

[第二个选项],基于 OP 问题中对 contains 的引用:您可以创建第二个列表,对原始列表进行排序,而不是使用 assertThat(来源,包含(有序))。这样最终的错误可以更准确地描述,因为如果一个元素不在预期的顺序中,它将被指出。比如这段代码

@Test
public void testName() throws Exception
{
List<Integer> actual = new ArrayList<Integer>();
actual.add(1);
actual.add(5);
actual.add(3);
List<Integer> expected = new ArrayList<Integer>(actual);
Collections.sort(expected);
assertThat(actual, contains(expected.toArray()));
}

将生成描述

java.lang.AssertionError: 
Expected: iterable containing [<1>, <3>, <5>]
but: item 1: was <5>
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.junit.Assert.assertThat(Assert.java:865)
at org.junit.Assert.assertThat(Assert.java:832)
...

关于java - assertThat - hamcrest - 检查列表是否排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19815004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com