JUnit测试预期异常的正确方法

时间:2017-02-21 17:48:50

标签: java unit-testing junit junit4

大家好我想知道这种测试我的异常的方式是否正常,我有这个例外我需要抛出第二个测试注释,我接收结果是一个红色的邪恶吧,一个成功和失败,就像你可以猜到失败是我关心的,我有一个失败();但原因是因为我认为这是测试异常的方法,现在我很困惑。

此外,我必须说我会得到绿色条,因为我期待异常,但我不知道失败是否是正确的方式来看到预期的异常的答案。

如果您有任何建议,我将不胜感激

processcount >= 5

4 个答案:

答案 0 :(得分:15)

有三种最常用的方法可以测试预期的异常:

第一种方法是最常用的方法,但您只能使用它测试预期异常的类型。如果ExceptionType不被抛出,则此测试将失败:

@Test(expected = ExceptionType.class)
public void testSomething(){
    sut.doSomething();
}

此外,您无法使用此方法指定失败消息

更好的选择是使用ExpectedException JUnit @Rule。在这里,您可以为预期的异常断言更多

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

@Test
public void testSomething(){
    thrown.expect(ExceptionType.class);
    thrown.expectMessage("Error message");
    thrown.expectCause(is(new CauseOfExeption()));
    thrown.reportMissingExceptionWithMessage("Exception expected"); 
    //any other expectations
    sut.doSomething();
}

第三个选项将允许您使用与使用ExpectedException @Rule相同的操作,但所有断言都应手动编写。但是,此方法的优点是您可以使用任何自定义断言和所需的任何断言库:

@Test
public void testSomething(){
    try{
        sut.doSomething();
        fail("Expected exception");
    } catch(ExceptionType e) {
    //assert ExceptionType e
    } 
}

答案 1 :(得分:4)

您可以使用ExpectedException,它可以提供有关预期抛出的异常的更准确信息,并具有验证错误消息的能力,如下所示:

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
public class TestClass {

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


    @Test
    public void GTFRICreationTester_shouldFail()  {
        expectedException.expect(TramaConProtolocoloDesconocido.class);
        factory.createLocomotive(weirdProtocol, false, new Date());
    }
}

要了解更多相关信息,请参阅我在此撰写的博客 - Expected Exception Rule and Mocking Static Methods – JUnit

答案 2 :(得分:1)

您无需使用Exception

抓住try-catch
@Test(expected = TramaConProtolocoloDesconocido.class)
public void GTFRICreationTester_shouldFail()  {

    factory.createLocomotive(weirdProtocol, false, new Date());

}

如果我们假设factory.createLocomotive(weirdProtocol, false, new Date())在应用导致exception抛出的方案时抛出exception

void createLocomotive(param...) {

    //something...

    throw new TramaConProtolocoloDesconocido();
}

答案 3 :(得分:1)

如果您使用的是java 8,我建议您去AssertJ库

public void GTFRICreationTester_shouldFail()  {
    assertThatExceptionOfType(EXCEPTION_CLASS).isThrownBy(() -> { factory.createLocomotive(weirdProtocol, false, new Date()) })
                                               .withMessage("MESSAGE")
                                               .withMessageContaining("MESSAGE_CONTAINING")
                                               .withNoCause();         

    }

使用该解决方案,您可以在一个验证异常类型,使用消息等。

如需更多阅读,请查看: http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion