我有代码,我在jUnit中检查异常。我想知道以下哪一项是一个很好的jUnit实践?
第一
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void checkNullObject() throws CustomException {
exception.expect(CustomException.class);
MyClass myClass= null;
MyCustomClass.get(null);
}
第二
@Test(expected=CustomException.class)
public void checkNullObject() throws CustomException {
MyClass myClass= null;
MyCustomClass.get(null);
}
编辑:请注意,CustomException是未经检查的自定义异常。 (虽然它不会对这个问题产生任何影响)。
答案 0 :(得分:14)
这取决于您要检查异常的内容。如果你所做的只是检查抛出异常,那么使用@Test(expected=...)
可能是最简单的方法:
@Test(expected=CustomException.class)
public void checkNullObject() throws CustomException {
MyClass myClass= null;
MyCustomClass.get(null);
}
但是,@ Rule ExpectedException还有很多选项,包括检查来自javadoc的消息:
// These tests all pass.
public static class HasExpectedException {
@Rule
public ExpectedException thrown= ExpectedException.none();
@Test
public void throwsNothing() {
// no exception expected, none thrown: passes.
}
@Test
public void throwsNullPointerException() {
thrown.expect(NullPointerException.class);
throw new NullPointerException();
}
@Test
public void throwsNullPointerExceptionWithMessage() {
thrown.expect(NullPointerException.class);
thrown.expectMessage("happened?");
thrown.expectMessage(startsWith("What"));
throw new NullPointerException("What happened?");
}
@Test
public void throwsIllegalArgumentExceptionWithMessageAndCause() {
NullPointerException expectedCause = new NullPointerException();
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("What");
thrown.expectCause(is(expectedCause));
throw new IllegalArgumentException("What happened?", cause);
}
}
因此,您可以检查消息,异常的原因。要检查消息,您可以使用匹配器,以便检查startsWith()
和类似的内容。
使用旧样式(Junit 3)throw / catch的一个原因是,如果您有特定要求。这些并不多,但可能会发生:
@Test
public void testMe() {
try {
Integer.parseInt("foobar");
fail("expected Exception here");
} catch (Exception e) {
// OK
}
}
答案 1 :(得分:0)
第二个版本绝对是标准的做法。在Junit 4看起来像以前那样老派的方式:
try {
codeThatShouldThrowException();
fail("should throw exception");
} catch (ExpectedException expected) {
//Expected
}
有时您可能希望以这种方式恢复,例如,如果您想在异常中声明有关该消息的内容。