java - 我是否需要测试接口(interface)的每个实现来测试接口(interface)?

标签 java unit-testing interface

通常,我的应用程序中只有一个接口(interface)实现,并且在为接口(interface)编写测试时始终使用第一个实现。假设我有一个接口(interface) Destroyer 和一个实现 DestroyerImpl。然后我会在测试中使用该类:

class DestroyerTest 
{
    private Destroyer destroyer = new DestroyerImpl();

    @Test
    public void test() { ... }   
}

然后通过在接口(interface)测试中实例化该类来隐式测试该类。 如果我编写另一个实现类 EpicDestroyer 我现在觉得我也必须对其进行测试。

那么,我是否需要编写两个测试类 DestroyerImplTestEpicDestroyerTest 来测试具有不同实现的相同 Destroyer 接口(interface)?那不是多余的吗?我可以test each implementation in the same test suite通过参数化它。这是这样做的方法吗?

最佳答案

我认为您对测试的想法存在误解。

测试接口(interface)没有任何意义,因为它只是一个规范。只能测试实现。所以你应该测试所有的实现。但是,您可以从接口(interface)中派生测试用例,因为所有实现都需要遵守其中的规范。因此,即使您有完全不同的实现,您也可以在它们之间共享测试。

在我看来应该有如下测试类:

import java.util.List;

import org.junit.Assert;
import org.junit.Test;


public abstract class AbstractModifiableListTest
{

    protected abstract <T> List<T> createListInstanceUnderTest(T... elements);

    @Test
    public void removeDecreasesSizeByOne() {
        List<String> list = this.<String>createListInstanceUnderTest("a","b","c");
        int originalSize = list.size();

        list.remove( 0 );
        int newSize = list.size();

        Assert.assertEquals( originalSize - 1, newSize );
    }
}

包含测试接口(interface)规范的测试用例 - 在本例中为java.util.List。然后,实现测试通过实现抽象方法并可能添加依赖于实现的测试用例来参数化测试用例。

关于java - 我是否需要测试接口(interface)的每个实现来测试接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26671286/

相关文章:

java - 如何对数组中的大量数字进行冒泡排序?

java - SWT 在组中创建滚动组合

angular - 禁用按钮的单元测试

delphi - 使用部分委托(delegate)实现接口(interface)

java - 从遍历中获取顶点或路径时,Tinkerpop 非常慢

java - 在同一类中实现 2 个不同的监听器并添加到 swing 组件中

python - setUpModule、tearDownModule 和 imports 可能在 Nose 底下乱序

javascript - 如何模拟在另一个导入中导入的方法

c# - 在c#中使用接口(interface)实例化类

java - 抽象类实现接口(interface),接口(interface)方法的实现是否可以决定子类扩展抽象父类(super class)?