如果抛出JUnit ExpectedException后如何继续测试?

我已经使用EdusedException功能设置了一些JUnit(4.12)测试,我希望测试在预期的异常之后继续进行。但是我从来没有看到日志“3”,因为执行似乎在异常之后停止,事件如果捕获?

这真的可能吗,如何实现?

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

@Test
public void testUserAlreadyExists() throws Exception {
    log.info("1");

    // Create some users
    userService.createUser("toto1");
    userService.createUser("toto2");
    userService.createUser("toto3");
    Assert.assertTrue( userService.userExists("toto1") );
    Assert.assertTrue( userService.userExists("toto2") );
    Assert.assertTrue( userService.userExists("toto3") );

    log.info("2");

    // Try to create an existing user
    exception.expect(AlreadyExistsException.class);
    userService.createUser("toto1");

    log.info("3");
}

答案 1

你不能这样做,当异常被抛出时,它被抛出是真实的,规则与否。ExpectedException

如果你真的想要这种行为,你可以回到“老派”模式:

try {
    userService.createUser("toto1");
    Assert.fail("expecting some AlreadyExistsException here")
} catch (AlreadyExistsException e) {
    // ignore
}

log.info("3");

但我不会打扰一些日志。


答案 2

这个SO解决方案似乎做了你想做的事情:JUnit在预期的异常之后继续断言事情

我自己也在想类似的事情。要继续测试,您必须在测试中自己捕获异常。该解决方案显示了一种优雅的方法。

注意:如果您制定规则以预期异常(就像您所做的那样),则在引发该异常时,测试将立即返回成功。参考资料: http://junit.org/javadoc/latest/org/junit/rules/ExpectedException.html


推荐