有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我需要测试接口的每个实现来测试接口吗?

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

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

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

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

那么,我是否编写了两个测试类DestroyerImplTestEpicDestroyerTest,它们都用不同的实现测试相同的Destroyer接口?这不是多余的吗?我可以通过参数化来test each implementation in the same test suite。这样做吗


共 (4) 个答案

  1. # 1 楼答案

    如果您正在测试接口,那么使用单个实现测试它就足够了,因为接口不依赖于特定的实现

    当然,您可能想测试每个实现,但目的是测试实现类,而不是接口本身

  2. # 2 楼答案

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

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

    在我看来,应该有如下的测试课程:

    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。然后,实现测试通过实现抽象方法并可能添加依赖于实现的测试用例来参数化测试用例

  3. # 3 楼答案

    我不会说接口可以测试,因为它们提供抽象而不是实现。另一方面,测试需要确保是否实现了特定的行为(并且该行为在类中)

    So, do I write two test classes DestroyerImplTest and EpicDestroyerTest that both test the same Destroyer interface with different implementations?

    我会说,是的

  4. # 4 楼答案

    我从不“测试”接口,因为没有什么可测试的。接口描述了每个实现要交付的服务,以及它的合同

    因此,您必须测试该服务的每个实现,以确保每个人都能正确地完成工作