如何在JUnit测试中测试Collection中元素的排序?

我想用JUnit测试validation我在Java中的集合的排序算法。 如果我将“B”,“C”,“A”输入到集合中并希望对其进行排序(例如按字母顺序排列),使用JUnit进行测试的正确方法是什么?

我实现了Comparable接口,并希望确保我的排序正常。

我想这个问题可以扩展到Java或JUnit以外的任何语言的一般测试。

我将使用预期顺序中的值创建另一个集合,然后检查结果是否匹配。

但说实话,如果您只是想检查IComparable的实现而不是某种排序算法,我只会对调用compareTo的结果进行断言。 编写测试会更简单, 容易理解任何失败。

(如果排序测试失败,那只会意味着许多比较中的一个做错了。它不会帮助你弄清楚哪个比较做错了。)

不确定我是否完全接受了你的问题。 当谈到编写测试的技术方面时,你可以使用这些方面的东西(例如使用Hamcrest ):

 import java.util.Collection; import org.hamcrest.collection.IsIterableContainingInOrder; import org.junit.Assert; import org.junit.Test; import com.google.common.collect.Lists; public class MyTest { @Test public void collectionTest() { final Collection actual = Lists.newArrayList("AAA", "ABC", "BBB", "AZZ"); Assert.assertThat(actual, IsIterableContainingInOrder.contains("AAA", "ABC", "AZZ", "BBB")); } } 

运行这个的结果:

 java.lang.AssertionError: Expected: iterable containing ["AAA", "ABC", "AZZ", "BBB"] got: <[AAA, ABC, BBB, AZZ]> at org.junit.Assert.assertThat(Assert.java:778) at org.junit.Assert.assertThat(Assert.java:736) at ... 

如果你的问题更具哲学性,那么还有另外两个答案……

我会说从特殊情况开始:

  1. 空输入
  2. 输入顺序相反
  3. 按顺序输入

无论您使用JUnit还是任何其他测试框架,都无所谓。 关于unit testing的问题是你想测试你的类行为(这就是UNIT测试的原因)。 测试类本身不应该实现Comparable,它应该是你的类,但是为了测试这个是无关紧要的。

考虑一下您要测试的方案列表。

例如,提交“B”,“C”,“A”,并确保您返回的内容等于“A”,“B”,“C”。 如果您提交了有序列表,请确保返回相同的有序列表。 确保它正确处理空输入,空输入和边界情况(“A”,“B”,“A”可能是一个很好的测试)。 对于每种情况,您应该有一个测试,并且您的断言应该在每个测试中确切地检查特定情况。