接口的多个测试类汇总到junit 4中的套件中?

时间:2011-04-08 12:16:26

标签: java interface junit

我有一个接口,用于定义一个对象的行为,该对象执行一些名为GraphSearcher的图搜索。我目前有许多不同的实现,在路上有更多的变化,所以我已经将测试类定义为抽象的具体测试方法和实例化图搜索对象的实现的抽象方法。

这很好,只是我有一堆不同的类(目前大约10个),每个类都根据一些真实的数据运行了大量的测试。这意味着对于每个concreate实现,我最终编写了一大堆包含实例化方法的测试类。

这对我来说似乎有些混乱,我想知道是否有人知道更好的解决方案。理想情况下,我希望能够将GraphSearcher工厂对象传递到某种测试套件中,并运行所有各种测试类。这意味着我只需编写一小段代码就可以针对所有测试运行新的GraphSearcher实现。我只是不确定如何使用junit 4来解决这个问题。我确信必须有一些相当标准的方法来做到这一点,但我还没有找到任何东西。任何人都有的任何指针将不胜感激

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你只需要一些测试代码,并希望多次运行它,每次使用不同的GraphSearcher实现,对吧?如果是这样,我可能会选择Paremeterized JUnit跑步者。它看起来像这样:

@RunWith(Parameterized.class)
public class GraphSearcherTest
{
    private GraphSearcher testedSearcher;

    public GraphSearcherTest(GraphSearcher searcher)
    {
        this.testedSearcher = searcher;
    }

    @Parameters
    public static Collection<Object[]> getParameters()
    {
        return Arrays.asList(new Object[][] {
                { new GraphSearcherImpl1() },
                { new GraphSearcherImpl2() }
        });
    }

    @Test
    public void testGraphSearcher()
    {
        // execute the test
        testedSearcher.search();

        // make some assertions
    }
}

关键部分是:

  • @RunWith(Parameterized.class)注释
  • 采用GraphSearcher的测试实现的构造函数
  • 返回Collection的@ Parameters-annotated方法(任意名称)。将为集合的每个项调用此方法,并将集合中的对象添加到测试的构造函数中。
  • 集合中Object []的大小必须与构造函数的参数数量相匹配

因此在这种情况下,测试将被调用两次。第一个测试将在其构造函数中获取GraphSearcherImpl1实例,第二个测试将获得GraphSearcherImpl2实例。

答案 1 :(得分:0)

您可以使用@Parameters注释为您提供不同的界面实现。

例如:http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/