如何测试抛出异常并在junit中捕获异常

时间:2014-08-27 05:44:52

标签: java junit

我需要测试以下代码:

try{
   while((testBean = csvReader.read(TestBean.class,headers,getCellProcessors()))!=null){
      System.out.println("no excpetion");
      i=5;
   }
}catch(SuperCsvException csvExc){
   System.out.println("superCSV excpetion");
   i=0;
}catch(Exception ex){
   System.out.println("excpetion");
   i=0;
}

如何测试是否抛出SuperCsvException

7 个答案:

答案 0 :(得分:4)

JUnit 4 supports this
@Test(expected=<YourExpectedException>.class)
public void testExceptionThrown() {
// call the method that throws exception
    }

答案 1 :(得分:1)

&#34; new&#34; JUnit期望异常的方式是规则的方式

public class ThisIsTheTestClass {

    @Rule
    public ExpectedException exception = ExpectedException.none();

    @Test
    public void testingSomeBehaviorThatShouldThrowAnException() throws SuperCsvException {
        exception.expect(SuperCsvException.class);
        // Put your testing effort here (setup, call, assertions, ...).
    }

}

如果有兴趣,请查看一些information about rules

答案 2 :(得分:0)

要么是预期的,要么是预期的。如果需要,那么你需要这样的东西:

try {
   doSomething();
   fail("No exception thrown");
}
catch (MyException e) {
   // expected
}

答案 3 :(得分:0)

JUnit 4支持此功能。您可以将单元测试声明为:

@Test(expected=SuperCsvException.class)
public void _testSuperCsvException() {
    // call to function containing your code
}

答案 4 :(得分:0)

我的个人经历总是像

boolean caught = false;
try {
    runCodeToThrowException();
} catch (MyException e) {
    caught = true;
}

assertTrue(caught);

我不喜欢JUnit处理它的原因是我无法准确控制抛出此异常的位置和方式。如果我试图在一大段代码中捕获任何通用内容,那可能不太好,例如IllegalArgumentException

答案 5 :(得分:0)

您的测试方法是错误的。您应该将您正在测试的每个方法或类视为具有规范,可访问接口(非private方法和字段)和实现的单元。您应该测试该单元在通过其可访问接口进行操作时是否符合其规范。您不应该测试该单元是否具有特定实现。您可以使用您对实现的了解来指导您选择测试用例,以选择可能被错误实现的案例。

因此,在您的情况下,可以抛出异常的事实是实现细节。你最好有一个测试用例,它也会导致抛出异常。当你的代码试图捕获异常时,我想这是因为你的方法的规范说如果csvReader出现问题,该方法不应抛出任何异常。因此,您可以设置一个测试用例,设置csvReader以抛出异常。如果方法抛出异常,JUnit将无法通过测试。

注意区别:测试用例测试抛出并捕获异常(实现细节);它测试该方法在调用csvReader.read将抛出异常的情况下不抛出或传播异常。通过禁止调用csvReader.read来捕获异常,允许实现满足该约束。

答案 6 :(得分:-1)

如果SuperCsvException是Exception的子类,请尝试这样的事情:

    Exception ex=null;
    try {
        while ((testBean = csvReader.read(TestBean.class, headers, getCellProcessors())) != null) {
            System.out.println("no excpetion");
            i = 5;
        }
    } catch (SuperCsvException csvExc) {
        System.out.println("superCSV excpetion");
        i = 0;
        ex=csvExc;
    } catch (Exception ex) {
        System.out.println("excpetion");
        i = 0;
    }
    Assert.assertNotNull(ex);