通常,我在我的应用程序中只有一个接口的实现,在为接口编写测试时总是使用第一个实现。假设我有一个接口Destroyer和一个实现DestroyerImpl。然后我会在测试中使用这个类:
class DestroyerTest
{
private Destroyer destroyer = new DestroyerImpl();
@Test
public void test() { ... }
}然后,通过在接口测试中实例化类来隐式测试该类。如果我编写了另一个实现类EpicDestroyer,我现在觉得我也必须对它进行测试。
那么,我是否编写了两个测试类DestroyerImplTest和EpicDestroyerTest,它们都用不同的实现测试相同的Destroyer接口?这不是多余的吗?我可以通过参数化来实现test each implementation in the same test suite。就这样做吗?
发布于 2014-10-31 09:32:55
我认为你对测试的思考存在误解。
测试接口是没有意义的,因为它只是一个规范。只有实现才能被测试。所以你应该测试所有的实现。但是,您可能可以从接口派生测试用例,因为所有实现都需要遵守其中的规范。因此,即使您有完全不同的实现,您也可以在这些实现之间共享测试。
在我看来,应该有如下的测试类:
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 );
}
}包含测试接口规范的测试用例--在本例中为java.util.List。然后,通过实现抽象方法并可能添加依赖于实现的测试用例,实现测试用例的参数化。
发布于 2014-10-31 09:33:05
我从不“测试”接口,因为没有什么需要测试的。接口描述服务的每个实现交付,它的契约。
因此,您必须测试此服务的每个实现,以确保每个人都正确地完成这项工作。
发布于 2014-10-31 09:33:08
我不会说接口是可以测试的,因为它们提供抽象而不是实现。另一方面,测试需要确保是否实现了特定的行为(并且行为在类中)。
那么,我是否编写了两个测试类DestroyerImplTest和EpicDestroyerTest,它们都用不同的实现测试相同的销毁器接口?
我会说,是。
https://stackoverflow.com/questions/26671286
复制相似问题