Testing 通用JUnit测试类

Testing 通用JUnit测试类,testing,junit,Testing,Junit,我编写了一个接口MyInterface,它将由不同的实现者实现 我还编写了一个类MyInterfaceTest,其中包含所有实现者都应该能够用来测试其实现的通用测试方法 我只是不知道如何让它作为JUnit测试工作 目前,我有这样的想法: public class MyInterfaceTest { private static MyInterface theImplementationToTest = null; @BeforeClass public static void

我编写了一个接口
MyInterface
,它将由不同的实现者实现

我还编写了一个类
MyInterfaceTest
,其中包含所有实现者都应该能够用来测试其实现的通用测试方法

我只是不知道如何让它作为JUnit测试工作

目前,我有这样的想法:

public class MyInterfaceTest {
    private static MyInterface theImplementationToTest = null;

    @BeforeClass public static void setUpBeforeClass() throws Exception {
                // put your implementation here:
        theImplementationToTest = new Implementation(...);
    }

    @AfterClass public static void tearDownAfterClass() throws Exception { 
        theImplementationToTest = null;
    }

    @Test public void test1() { /* uses theImplementationToTest */ }    
    @Test public void test2() { /* uses theImplementationToTest */ }    
}
我使用静态方法
setUpBeforeClass
,因为每个实现的初始化都需要很多时间,所以我希望对所有测试初始化一次

使用此版本的测试,实现者必须更改
setUpBeforeClass
的代码,并放置自己的实现


我确信还有另一种方法可以编写
MyInterfaceTest
,这样实现者只需继承它或向它发送一个参数,而不必更改代码。然而,我在JUnit方面的经验不足,无法让它发挥作用。你能告诉我怎么做吗?

你可以让子类实现before类方法并继承所有测试

import org.junit.*;

public class ImplementingClassTest extends MyInterfaceTest {

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        // put your implementation here:
         theImplementationToTest = new MyInterfaceImpl();
    }

}
这使您正在编写的抽象类看起来像:

import org.junit.*;

public abstract class MyInterfaceTest {
    protected static MyInterface theImplementationToTest = null;

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        theImplementationToTest = null;
    }

    @Test
    public void test1() { /* uses theImplementationToTest */
    }

    @Test
    public void test2() { /* uses theImplementationToTest */
    }
}

通常,您会使该方法成为实现抽象所需的子类。无法在此处执行此操作,因为它是静态设置方法。(此外,您可能希望重构实例化以避免花费很长时间,因为这通常是一种反模式)。

您应该下载一个jar名称
junit-4.10.jar
,并将其添加到您的项目中。然后让您的类
MyInterfaceTest
继承名为
TestCase
的类,就像
公共类MyInterfaceTest扩展TestCase

最初的问题是什么?如何使用随子类不同的实现重用静态设置/拆卸。正如我在回答中所描述的那样。