【问题标题】:Junit lookup from a list and assert their order [closed]Junit 从列表中查找并断言它们的顺序 [关闭]
【发布时间】:2017-03-21 06:41:25
【问题描述】:

假设我有一个苹果列表“listOfApples”。

class apple {
    int serial;
    int price;
    ......
}

多个苹果可能有相同的序列号。我必须确保 listOfApples 中的所有苹果都根据它们的序列进行排序。
更准确地说,listOfApples 中序列号为 0 的所有苹果都在列表的前面。
如何使用 junit 测试 listOfApples 是否保持苹果有序?

【问题讨论】:

  • 你真的尝试过什么吗?发生了什么?给minimal reproducible example
  • 并阅读有关 java 编码约定的信息。类名以大写开头。是的,您的问题确实缺少关键信息。请花一些时间在help center 了解这里的工作原理。绝对不是这样的。

标签: java unit-testing junit junit4 hamcrest


【解决方案1】:

这似乎相对简单——只需测试列表在排序前后是否相同:

List<Apple> sortedApples = new ArrayList<>(listOfApples);
sortedApples.sort(Comparator.comparingInt(a -> a.serial));
assertEquals(sortedApples, listOfApples);

如果两个列表相等,则原始列表已正确排序。

加法:

@Harmlezz 在 cmets 中的表现不错:即使原始列表已正确排序,此测试也可能失败。另一种选择是:

assertTrue(IntStream.range(1, sortedAppples.size())
    .allMatch(i -> sortedApples.get(i).serial >= sortedApples.get(i-1).serial));

【讨论】:

  • 这是要走的路。如果List 包含相同顺序的相同项目,则List 等于另一个List。见docs.oracle.com/javase/7/docs/api/java/util/…
  • 感谢朋友@sprinter。在我看来它会工作。我会检查一下,显然会通知你。
  • 正如我在回答中提到的,具有相同序列的苹果在排序后可能会出现在列表中的不同位置,这可能会导致测试失败。
  • @sprinter:现在我比我更喜欢你的第二个解决方案 :-) 当sortedApples 为空时,它甚至适用于这种情况。
【解决方案2】:

由于苹果可能有相同的序列,你不能依赖于列表的排序,因为具有相同序列的苹果可能会出现在不可预知的位置:因此尝试:

@Test
public void testOrderingOfProvidedApples() {
    int serial = Integer.MIN_VALUE;
    for (Apple apple : listOfApples()) {
        assertTrue(apple.getSerial() >= serial);
        serial = apple.getSerial();
    }
}

【讨论】:

  • 非常感谢@Harmlezz。它奏效了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多