我是否需要测试接口的每个实现来测试接口?

2 java unit-testing interface

通常,我的应用程序中只有一个接口的实现,并且在为接口编写测试时总是使用第一个实现。假设我有一个 interfaceDestroyer和一个 implementation DestroyerImpl。然后我会在测试中使用那个类:

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

    @Test
    public void test() { ... }   
}
Run Code Online (Sandbox Code Playgroud)

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

那么,我是否编写了两个测试类DestroyerImplTest并且EpicDestroyerTestDestroyer用不同的实现测试相同的接口?那不会是多余的吗?我可以通过参数化在同一个测试套件中测试每个实现。这是这样做的方法吗?

Spa*_*ker 5

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

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

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

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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

包含测试接口规范的测试用例 -java.util.List在这种情况下。然后,实现测试通过实现抽象方法并可能添加依赖于实现的测试用例来参数化测试用例。