大家好我想知道这种测试我的异常的方式是否正常,我有这个例外我需要抛出第二个测试注释,我接收结果是一个红色的邪恶吧,一个成功和失败,就像你可以猜到失败是我关心的,我有一个失败();但原因是因为我认为这是测试异常的方法,现在我很困惑。
此外,我必须说我会得到绿色条,因为我期待异常,但我不知道失败是否是正确的方式来看到预期的异常的答案。
如果您有任何建议,我将不胜感激
processcount >= 5
答案 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