java - 为接口(interface)的多个实现编写单个单元测试

标签 java unit-testing junit junit4 junit-runner

我有一个接口(interface) List,它的实现包括单链表、Doubly、Circular 等。我为 Singly 编写的单元测试应该适用于大多数 Doubly 以及 Circular 和任何其他新实现的界面。因此,不是为每个实现重复单元测试,JUnit 是否提供了一些内置的东西,让我有一个 JUnit 测试并针对不同的实现运行它?

使用 JUnit 参数化测试,我可以提供不同的实现,例如单、双、循环等,但对于每个实现,相同的对象用于执行类中的所有测试。

最佳答案

我可能会避免使用 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(); 
    }

}

这样做的好处(而不是创建一个测试所有实现的测试类)是,如果有一些特定的极端情况你想用一个实现来测试,你可以添加更多的测试到特定的测试子类。

关于java - 为接口(interface)的多个实现编写单个单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16237135/

相关文章:

java - LDAP 搜索过滤器不起作用

c++ - 模拟 - 方法和工具

junit - 如何过滤一些要分析代码覆盖率的方法

java - Spring Boot 1.5.2 Controller 层测试

java - 如何将 jUnit 5 与 Gradle 结合使用

java - 存储在列表中时是否可以检索泛型类型?

java - 需要帮助来创建算法,根据人们的意见将他们分组

python - 如何模拟 ZipFile 构造函数?

unit-testing - 您如何测试特定的 Rust 错误?

java - 在Java中使用selenium WebDriver查找具有继承元素的HTML元素的文本