如何在JUnit 4中创建一种抽象的超级测试类?

时间:2014-05-30 17:17:27

标签: java unit-testing junit

考虑以下具体方案:有人创建了许多测试,这些测试完全测试了实现Collection<E>的类必须遵守的功能。那么如何使用该测试类(以某种方式)来测试Collection<E>的具体实现?

以示例:

public class CollectionTest {
    //lots of tests here
}

public class ACollection<E> implements Collection<E> {
    //implementation and custom methods
}

public class BCollection<E> implements Collection<E> {
    //implementation and other custom methods
}

我应该如何编写测试类,以便最少发生代码重复?

public class ACollectionTest {
    //tests for Collection<E>, preferably not duplicated
    //tests for custom methods
}

public class BCollectionTest {
    //tests for Collection<E>, preferably not duplicated
    //tests for other custom methods
}

换句话说,是否可以扩展CollectionTest&#34;,但是在ACollectionTestBCollectionTest(或更多)的实例上运行测试?请注意,例如,将ACollection<E>用作Collection<E>后,仍然可以访问这些方法。

1 个答案:

答案 0 :(得分:4)

在基类中:

protected Collection<Foo> collectionUnderTest;

@Test
public void shouldDoThis() {
    // uses collectionUnderTest
}

@Test
public void shouldDoThat() {
    // uses collectionUnderTest
}

在子类中,特定于ACollection实现:

@Before
public void prepare() {
    this.collectionUnderTest = new ACollection<>();
}