我可能会避免JUnit的参数化测试(恕我直言,这些测试非常笨拙地实现),而只是制作一个抽象的测试类,它可以被测试实现继承:List
public abstract class ListTestBase<T extends List> {
private T instance;
protected abstract T createInstance();
@Before
public void setUp() {
instance = createInstance();
}
@Test
public void testOneThing(){ /* ... */ }
@Test
public void testAnotherThing(){ /* ... */ }
}
然后,不同的实现获得自己的具体类:
class SinglyLinkedListTest extends ListTestBase<SinglyLinkedList> {
@Override
protected SinglyLinkedList createInstance(){
return new SinglyLinkedList();
}
}
class DoublyLinkedListTest extends ListTestBase<DoublyLinkedList> {
@Override
protected DoublyLinkedList createInstance(){
return new DoublyLinkedList();
}
}
这样做的好处是(而不是创建一个测试类来测试所有实现),如果想要使用一个实现测试一些特定的角落情况,则可以向特定的测试子类添加更多测试。