Search code examples
javajunit4expected-exceptionjunit-rule

How to continue test after JUnit ExpectedException if thrown?


I have set up some JUnit (4.12) test with the ExpectedException feature, and I would like the test to continue after the expected exception. But I never see the log '3', as the execution seems to stop after the exception, event if catch?

Is this actually possible, and how?

@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");
}

Solution

  • You cannot do that, when the exception is thrown it's thrown for real, ExpectedException rule or not.

    If you really want this kind of behaviour, you can go back to the "old school" pattern:

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

    But I wouldn't bother for some log.