7

我写了一个接口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 方面的经验不足,无法使其正常工作。你能告诉我怎么做吗?

4

2 回答 2

7

您可以让子类仅实现 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 */
    }
}

通常,您会将方法设为实现抽象所需的子类。在这里不能这样做,因为它是一种静态设置方法。(此外,您可能希望重构实例化以不花费很长时间,因为这通常是一种反模式)。

于 2012-07-22T14:36:44.680 回答
-4

您应该下载一个 jar 名称junit-4.10.jar并将其添加到您的项目中。然后让你的类MyInterfaceTest继承名为的类TestCase,比如public class MyInterfaceTest extends TestCase

于 2012-07-22T14:42:20.800 回答