Java 如何测试junit中是否抛出并捕获异常

Java 如何测试junit中是否抛出并捕获异常,java,junit,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;

我需要测试以下代码:

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;
}

如何测试是否抛出并捕获了异常。

异常是预期的还是不预期的。如果需要,那么您需要以下内容:

try {
   doSomething();
   fail("No exception thrown");
}
catch (MyException e) {
   // expected
}
    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);

异常可能是预期的,也可能不是预期的。如果需要,那么您需要以下内容:

try {
   doSomething();
   fail("No exception thrown");
}
catch (MyException e) {
   // expected
}
    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);

如果SuperCsvException是Exception的子类,请尝试以下操作:

try {
   doSomething();
   fail("No exception thrown");
}
catch (MyException e) {
   // expected
}
    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);

如果SuperCsvException是Exception的子类,请尝试以下操作:

try {
   doSomething();
   fail("No exception thrown");
}
catch (MyException e) {
   // expected
}
    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);
@Test(预期=.class)
public void testException抛出(){

//调用引发异常的方法 }
@Test(预期=.class)
public void testException抛出(){

//调用引发异常的方法 }
JUnit4支持此功能。您可以将单元测试声明为:

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

JUnit4支持这一点。您可以将单元测试声明为:

@Test(expected=SuperCsvException.class)
public void _testSuperCsvException() {
    // call to function containing your code
}
JUnit期待异常的“新”方式是规则方式:

如果您感兴趣,请进一步查看一些异常。

JUnit期待异常的“新”方式是规则方式:


如果有兴趣的话,可以看一些。

我的个人经历总是这样

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

assertTrue(caught);

我不喜欢让JUnit处理它的原因是,我无法准确控制该异常的抛出位置和方式。如果我试图在一大堆代码中捕捉到任何通用的东西,例如,
IllegalArgumentException

我的个人经历总是这样的话,那就不太好了

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

assertTrue(caught);

我不喜欢让JUnit处理它的原因是,我无法准确控制该异常的抛出位置和方式。如果我试图在一大堆代码中捕获任何通用的东西,例如,
IllegalArgumentException

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

因此,在您的例子中,可以抛出异常这一事实是一个实现细节。您最好有一个也会导致抛出异常的测试用例。当您的代码试图捕获异常时,我想这是因为您方法的规范规定,如果
csvReader
出现问题,该方法不应抛出任何异常。因此,您可以使用一个测试用例来设置
csvReader
以引发异常。如果方法确实抛出异常,JUnit将使测试失败


注意区别:该测试用例不测试异常是否被抛出和捕获(实现细节);它测试在调用
csvReader.read
将引发异常的情况下,该方法不会引发或传播异常。通过捕获异常或避免调用
csvReader.read
您的测试方法是错误的,允许实现满足该约束。您应该将每个正在测试的方法或类视为具有规范、可访问接口(非<代码>私有< /COD>方法和字段)的单元和实现。您应该测试该单元在通过其可访问接口进行操作时是否符合其规范。您不应该测试单元是否有特定的实现。您可以使用您对实现的了解来指导您选择测试用例,以选择可能未正确实现的用例

因此,在您的例子中,可以抛出异常这一事实是一个实现细节。您最好有一个也会导致抛出异常的测试用例。当您的代码试图捕获异常时,我想这是因为您方法的规范规定,如果
csvReader
出现问题,该方法不应抛出任何异常。因此,您可以使用一个测试用例来设置
csvReader
以引发异常。如果方法确实抛出异常,JUnit将使测试失败


注意区别:该测试用例不测试异常是否被抛出和捕获(实现细节);它测试在调用
csvReader.read
将引发异常的情况下,该方法不会引发或传播异常。通过捕获异常或避免调用
csvReader.read

可以允许实现满足该约束。您可以安排一个测试,其中csvReader.read()抛出异常(例如,通过模拟),调用您的方法,并检查此方法是否没有抛出任何异常,并将i设置为0。你熟悉嘲弄吗。。。那里的信息是否不足以满足您的情况?或者我误解了这个问题?以上是代码,我必须为它编写junit测试下面提供的解决方案没有一个有效阅读我的上述评论,回答它向您提出的问题,并在必要时询问有关它的澄清。您安排了一个测试,其中csvReader.read()抛出异常(例如,通过模拟),调用您的方法,并检查此方法是否未引发任何异常,并将i设置为0。你熟悉嘲弄吗。。。那里的信息是否不足以满足您的情况?还是我误解了这个问题?以上是代码,我必须为它编写junit测试以下提供的解决方案都不起作用请阅读我的上述评论,回答它向您提出的问题,并在必要时询问有关它的澄清。如果需要,您也可以让junit检查它。如果需要,还可以让JUnit检查它。为什么这是被接受的一个,异常已经被捕获,所以junit将不会出现