以下是我的接口代码和三个类。我使用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上测试
答案 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;。