我对Java真的很陌生。
我在构造函数上运行一些 JUnit 测试。构造函数是这样的,如果它的参数之一被赋予 null 或空字符串,它应该抛出异常。
当我在 JUnit 中使用 null 或空字符串参数测试此构造函数时,我得到一个红色条,尽管我几乎 100% 确定构造函数方法在将此类参数传递给它时确实会引发异常。
如果该方法以应有的方式抛出异常,JUnit 中不应该有一个绿色条吗?还是当异常抛出按预期方式工作时,您应该得到一个红色条?
@Test(expected = Exception.class)
告诉 Junit 异常是预期的结果,因此当抛出异常时测试将通过(标记为绿色)。
为了
@Test
如果抛出异常,Junit 会将测试视为失败,前提是它是未经检查的异常。如果检查了异常,它将无法编译,您将需要使用其他方法。此链接可能会有所帮助。
你确定你告诉它期待异常吗?
对于较新的junit(> = 4.7),您可以使用类似(从这里)
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void testRodneCisloRok(){
exception.expect(IllegalArgumentException.class);
exception.expectMessage("error1");
new RodneCislo("891415",dopocitej("891415"));
}
对于较旧的junit,这是:
@Test(expected = ArithmeticException.class)
public void divisionWithException() {
int i = 1/0;
}
如果您的构造函数与此类似:
public Example(String example) {
if (example == null) {
throw new NullPointerException();
}
//do fun things with valid example here
}
然后,当您运行此 JUnit 测试时,您将看到一个绿色条:
@Test(expected = NullPointerException.class)
public void constructorShouldThrowNullPointerException() {
Example example = new Example(null);
}
使用 ExpectedException Rule(4.7 版)的一个优点是您可以测试异常消息而不仅仅是预期的异常。
并且使用 Matchers,您可以测试您感兴趣的消息部分:
exception.expectMessage(containsString("income: -1000.0"));
尽管ExpectedException 规则@Test(expected = MyException.class)
是非常好的选择,但在某些情况下,JUnit3 风格的异常捕获仍然是最好的方法:
@Test public void yourTest() {
try {
systemUnderTest.doStuff();
fail("MyException expected.");
} catch (MyException expected) {
// Though the ExpectedException rule lets you write matchers about
// exceptions, it is sometimes useful to inspect the object directly.
assertEquals(1301, expected.getMyErrorCode());
}
// In both @Test(expected=...) and ExpectedException code, the
// exception-throwing line will be the last executed line, because Java will
// still traverse the call stack until it reaches a try block--which will be
// inside the JUnit framework in those cases. The only way to prevent this
// behavior is to use your own try block.
// This is especially useful to test the state of the system after the
// exception is caught.
assertTrue(systemUnderTest.isInErrorState());
}
另一个声称在这里提供帮助的库是catch-exception;然而,截至 2014 年 5 月,该项目似乎处于维护模式(被 Java 8 淘汰),并且很像 Mockito 捕获异常只能操作非final
方法。