【发布时间】:2016-09-19 04:42:29
【问题描述】:
JUnit 4.12
我目前正在为类方法编写测试。这是它的样子
public interface MyInterface{
//method declaration
}
public class MyClass implements MyInterface{
private int a;
private in b;
public MyClass(int a, int b){
if(a <= b + 5)
throw new IllegalArgumentException("Invalid arguments");
this.a = a;
this.b = b;
}
//methods
}
现在我想测试这个类:
public class MyClassTest{
private static final int THRESHOLD = 1000;
private MyClass mc;
@Before
public void init(){
Random rnd = new Random();
int a = rnd.nexInt(THRESHOLD),
b = rnd.nexInt(THRESHOLD);
mc = new MyClass(a, b);
}
}
但在这种情况下,init() 可能会抛出异常。所以我想测试保留不变量以及初始化一个对象以测试它的其他方法。
如何在 JUnit 中正确地做到这一点?
【问题讨论】:
-
这个单元测试设计不正确。您通常会有 3 个具有固定值的测试用例
a和b。一种测试a是否低于b+5,一种测试a等于b+5,最后一种测试a大于b+5。在这里使用Random没有必要也没有帮助。 -
为什么在
@before中这样做?如果你想测试异常,只需一个测试。 -
在大多数情况下,在测试时使用随机/非确定性值是个坏主意。即使在应该以某种随机方式表现的类中,测试通常也被设计成它们的行为以某种方式变得可预测。
-
我认为OP误解了
@Before的功能。通常,在测试类中使用@Before来初始化测试所需的一些值。此方法不调用任何测试,JUni-Runner 会为您完成。 -
我同意@Psycho Punch。您要做的是测试已知的确定值以控制您的测试。如果您想测试异常,请在其中输入一个会引发异常的值,然后为该测试输入 @Test(expected = Exception.class)。请参阅以下链接以更好地了解如何测试异常。 stackoverflow.com/questions/15216438/junit-testing-exceptions