当前位置: 首页 > 知识库问答 >
问题:

为接口的多个实现编写单个单元测试

钮鸿煊
2023-03-14

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

使用JUnit参数化测试,我可以提供不同的实现,如Singly、doubly、circular等,但对于每个实现,都使用相同的对象来执行类中的所有测试。

共有1个答案

吴浩博
2023-03-14

我可能会避免JUnit的参数化测试(这些测试的实现非常笨拙),而只是创建一个抽象的列表测试类,这些测试类可以由测试实现继承:

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(); 
    }

}

这样做的好处是(而不是创建一个测试类来测试所有的实现),如果您想用一个实现测试一些特定的角落案例,您可以向特定的测试子类添加更多的测试。

 类似资料:
  • 问题内容: 我有一个接口,其实现包括单链接列表,双精度,循环等。我为单精度编写的单元测试应该对大多数双精度以及环形以及接口的任何其他新实现都有利。因此,JUnit不会为每个实现重复执行单元测试,而是提供一些内置的功能,让我拥有一个JUnit测试并针对不同的实现运行它吗? 使用JUnit参数化测试,我可以提供不同的实现,例如单,双,循环等,但是对于每个实现,都使用相同的对象执行类中的所有测试。 问题

  • 创建单实现者接口仅仅是为了测试反模式吗?有更好的选择吗?

  • 我不会告诉你有关后台任务的单元测试的任何内容,因为Hangfire没有添加任何特定方法 (除了 IJobCancellationToken 接口参数)去改变任务。使用您最喜爱的工具,并照常写入单元测试。本节介绍如何测试创建的后台任务。 所有的代码示例都使用静态 BackgroundJob 类来告诉你如何做这个或那些东西,只是出于简单演示的目的。但是当你想测试调用的静态方法时,会变得很痛苦。 不用担

  • 我们的spring webapp实现了很多autowired接口。接口实现中的一些方法做了很多工作。方法本身有一个公共入口点,许多逻辑被抽象成许多私有方法。因此,单元和集成测试相当庞大,因为有很多要测试。在编写集成测试方面,我考虑的是一种模式,即让测试自动与实现而不是接口相关,将这些私有方法的作用域更改为公共的,但不将它们公开给拥有的接口。 这将允许对这些子例程进行单元测试,同时保持契约中没有很多

  • 试图弄清楚我是否可以使用spring kafka和spring kafka测试为@KafkaListener编写单元测试。 我的听众课。 我的测试类别: 我的测试配置类: 有什么简单的方法可以做到这一点吗? 或者我应该以其他方式测试@KafkaListener?在单元测试中,如何确保在Kafka中收到新消息时调用@KafkaListener。