Junit测试:测试多个异常

时间:2016-07-14 13:53:02

标签: java exception junit

对于我的应用程序,我想检查一个抛出两个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);
    }
}   

我可能完全错误地立即检查这两个异常。所以介绍我。

4 个答案:

答案 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);
}