如何在JUnit中为接口准备测试用例?

时间:2016-09-14 05:28:30

标签: java unit-testing junit interface junit4

以下是我的接口代码和三个类。我使用JUNIT测试,JUnit测试类也在下面。但是我不知道从我的具体类传递参数并在JUnit类中使用它。

接口
ArithmeticSkeleton.java

public interface ArithmeticSkeleton {
    int operation(int a, int b);
}

分部的具体类
Divide.java

public class Divide implements ArithmeticSkeleton{
    @Override
    public int operation(int a, int b) {
        return (a / b);
    }
}

乘法的具体类
Multiply.java

public class Multiply implements ArithmeticSkeleton{
    @Override
    public int operation(int a, int b) {
        return (a * b);
    }
}

增加的混凝土类
Addition.java

 public class Addition implements ArithmeticSkeleton{
        @Override
        public int operation(int a, int b) {
            return (a + b);
        }
    }

JUnit测试类
ArithmeticSkeletonTest.java

import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
    public class ArithmeticSkeletonTest {
        public ArithmeticSkeleton asInterface;
        public Divide div;
        public ArithmeticSkeletonTest(ArithmeticSkeleton asInterface) {
            this.asInterface = asInterface;
    }
    @Parameterized.Parameters
    public static Collection<Object[]> testInstances(){
        return Arrays.asList(
                new Object[]{new Multiply()},
                new Object[]{new Addition()},
                new Object[]{new Subtraction()},
                new Object[]{new Divide()}
               );
    }   
}

如何在ArithmeticSkeletonTest.java上测试

2 个答案:

答案 0 :(得分:0)

您不测试接口,测试实现。在这种情况下,您对接口的唯一合同是它提供了函数(int a, int b) -> int,没有更具体的说明(特别是,b是否可以为零?)。编译器确保维护此合同。

相反,您应该为每个实现类编写一个测试,验证它是否按预期执行操作。

作家有时会说你应该测试接口而不是实现。它们的意思是您的测试应该与API或合同(也称为代码的公共接口)进行交互(黑盒测试),而不是检查内部被测试类的状态(白盒测试)。这与将所有测试写入Java interface类型不同。

例如,您的Divide类的合同说它应该返回a除以b的商,并且您的测试用例应该确认这是发生的情况。但是,由您的班级决定如何实现它。您可以使用/运算符,但也可以执行迭代减法,或者可以使用BigInteger.divide()。其中任何一个都是Divide API的正确(如果不一定是理想的)实现,并且您的测试应该满足其中任何一个。

答案 1 :(得分:0)

您不测试接口,测试实现。因此,如果您有5个实现接口的类,则需要5个测试类,每个实现一个。你会发现这5个类有很多共同的代码,因为所有代码都会测试实现是否符合接口的契约。我发现将该公共代码提取到参数测试中是有用的,并且测试&#34;接口的类。它并没有真正地测试界面&#34 ;;它测试&#34;实现界面的类#34;。