我写了一个接口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 */ }
}
Run Code Online (Sandbox Code Playgroud)
我使用静态方法,setUpBeforeClass因为每个实现的初始化需要花费很多时间,所以我想为所有测试初始化一次.
有了这个版本的测试,实现者必须改变代码setUpBeforeClass并放置自己的实现.
我确信还有另一种写入方式MyInterfaceTest,因此实现者只需要继承它或发送一个参数,而不是更改代码.但是,我在JUnit中没有足够的经验来使它工作.你能告诉我怎么做吗?
您可以让子类只实现前面的类方法并继承所有测试.
import org.junit.*;
public class ImplementingClassTest extends MyInterfaceTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
// put your implementation here:
theImplementationToTest = new MyInterfaceImpl();
}
}
Run Code Online (Sandbox Code Playgroud)
这使得您正在编写的抽象类看起来像:
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 */
}
}
Run Code Online (Sandbox Code Playgroud)
通常,您将使该方法成为实现抽象所需的子类.这里不能这样做,因为它是一种静态设置方法.(此外,您可能希望重构实例化而不需要很长时间,因为这通常是反模式).