Java 在JUnit4中,一个接口的多个测试类汇总到一个套件中?

Java 在JUnit4中,一个接口的多个测试类汇总到一个套件中?,java,interface,junit,Java,Interface,Junit,我有一个接口,它定义了一个对象的行为,这个对象进行了一些叫做say GraphSearcher的图形搜索。我目前有一系列不同的实现,其中有更多的变化,因此我将测试类定义为抽象的,带有具体的测试方法和一个抽象的方法,该方法实例化了图形搜索对象的实现 这一切都很好,只是我有一堆不同的类(目前大约10个),每个类都基于一些真实世界的数据运行大量的测试。这意味着对于每个concreate实现,我最终编写了一整批测试类,其中只包含实例化方法 这一切对我来说似乎有点混乱,我想知道是否有人知道更好的解决办法。

我有一个接口,它定义了一个对象的行为,这个对象进行了一些叫做say GraphSearcher的图形搜索。我目前有一系列不同的实现,其中有更多的变化,因此我将测试类定义为抽象的,带有具体的测试方法和一个抽象的方法,该方法实例化了图形搜索对象的实现

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


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

您可以使用@Parameters注释为您提供不同的接口实现


例如:

如果我很了解您的问题,您只需要一些测试代码,并且希望多次运行它,每次都使用不同的GraphSearcher实现,对吗?如果是这样的话,我可能会选择一个经过调整的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(参数化的.class)
公共类GraphSearcher测试
{
专用图形搜索器测试搜索器;
公共图形搜索器测试(图形搜索器搜索器)
{
this.testedSearcher=搜索者;
}
@参数
公共静态集合getParameters()
{
返回Arrays.asList(新对象[][]{
{new GraphSearcherImpl1()},
{新GraphSearchImpl2()}
});
}
@试验
公共void testGraphSearcher()
{
//执行测试
testedSearcher.search();
//作一些断言
}
}
关键部分是:

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

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

这非常有效,非常感谢您的快速回复,我非常感谢