通用JUnit测试类
我写了一个接口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 class方法并继承所有的测试。
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
的类,就像public class MyInterfaceTest extends TestCase
。