通常,我的应用程序中只有一个接口(interface)实现,并且在为接口(interface)编写测试时始终使用第一个实现。假设我有一个接口(interface) Destroyer
和一个实现 DestroyerImpl
。然后我会在测试中使用该类:
class DestroyerTest
{
private Destroyer destroyer = new DestroyerImpl();
@Test
public void test() { ... }
}
然后通过在接口(interface)测试中实例化该类来隐式测试该类。
如果我编写另一个实现类 EpicDestroyer
我现在觉得我也必须对其进行测试。
那么,我是否需要编写两个测试类 DestroyerImplTest
和 EpicDestroyerTest
来测试具有不同实现的相同 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/