对于我的应用程序,我想检查一个抛出两个Exceptions
的函数。我想通过JUnit检查这些Exceptions
。
这是一个例子:
class MyFoo {
public void doSomeStuff(ArrayList<Object> objectList) {
if (objectList.size() >= 2) {
throw new IllegalArgumentException("");
}
if (objectList.size() == 0) {
throw new IllegalArgumentException("");
} else {
//do further Stuff
}
}
}
所以现在我想检查这个功能。我知道如何测试单个异常,但有没有办法立即检查两个异常?或者在自己的测试中检查每个异常是否更好?
这里测试一个例外:
public class MyFooTest {
@Rule
public ExpectedException thrown= ExpectedException.none();
@Test
public void testDoSomeStuff() {
thrown.expect(IllegalArgumentException.class);
List<Object> objectList=new ArrayList<>();
objectList.add(new Object());
objectList.add(new Object());
objectList.add(new Object());
doSomeStuff(objectList);
}
}
我可能完全错误地立即检查这两个异常。所以介绍我。
答案 0 :(得分:2)
我会声称在两个不同的测试用例中抛出了正确的异常。
$(selector).prev()
如果一个约束更改,则只更改一个测试。另一个保持不变。
答案 1 :(得分:2)
为了理智目的,我强烈建议每个方法使用单路径方案(如果在一次测试中有17个例外并且测试失败,那么你可以检查所有这17种可能性)但是你还问是否有可能。当然,如果你想将所有东西放在一起,你可以将assert.fail与try / catches一起使用,其中预期的异常会跳过Fail语句。
@Test
public void testDoSomeStuff() {
List<Object> objectList=new ArrayList<>();
try {
doSomeStuff(objectList);
Assert.fail("Should throw IllegalArgumentException!"):
}
catch(IllegalArgumentException e) {
logger.info("Threw IllegalArgumentException as expected.");
}
objectList.add(new Object());
objectList.add(new Object());
objectList.add(new Object());
try {
doSomeStuff(objectList);
Assert.fail("Should throw IllegalArgumentException!"):
}
catch(IllegalArgumentException e) {
logger.info("Threw IllegalArgumentException as expected.");
}
}
答案 2 :(得分:1)
您应该针对特定情况创建两个测试。在这种情况下,每个例外一个将保持单元测试清洁和清晰。
答案 3 :(得分:1)
您可以使用两种测试方法,并对每种类型的异常都有期望。在您的情况下,我认为您的逻辑只需要一个例外,因为您可以折叠您的条件:if (objectList.isEmpty() || (objectList.size() >= 2))
...然后使用不同的样本检查IllegalArgumentException
。
另一方面,如果你真的想把它分开,有两种方法有两个期望:@Test(expected = IllegalArgumentException.class)
。
@Test(expected = IllegalArgumentException.class)
public void doSomeStuff1() {
doSomeStuff(Collections.emptyList());
}
@Test(expected = IllegalArgumentException.class)
public void doSomeStuff2() {
List<Object> sample = new ArrayList<Object>();
for (int i = 0; i < 5; i++) { // Change `5` for something else if you want
sample.add(new Object());
}
doSomeStuff(sample);
}