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

时间:2012-03-30 14:39:53

标签: java junit

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

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

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

4 个答案:

答案 0 :(得分:10)

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

但说实话,如果你只是想检查IComparable不是某种排序算法的实现,我会只是做出关于调用compareTo的结果。编写测试会更简单,而更多更容易理解任何失败。

(如果排序测试失败,那只是意味着许多比较中的一个做错了。它无法帮助你解决 比较的问题错了。)

答案 1 :(得分:1)

我想说从特殊情况开始:

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

答案 2 :(得分:1)

不确定我是否完全接受了你的问题。谈到编写测试的技术方面,您可以使用这些内容(例如,使用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<String> 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 ...

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

答案 3 :(得分:0)

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

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

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