package org.mockitoutil; import org.assertj.core.api.Assertions; import org.junit.Test; import org.junit.rules.MethodRule; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.Statement; import static org.junit.Assert.*; import static org.mockito.Mockito.mock; public class SafeJUnitRuleTest { MethodRuleStub delegate = new MethodRuleStub(); SafeJUnitRule rule = new SafeJUnitRule(delegate); @Test public void happy_path_no_exception() throws Throwable { //when rule.apply(new Statement() { public void evaluate() throws Throwable { //all good } }, mock(FrameworkMethod.class), this).evaluate(); //then assertTrue(delegate.statementEvaluated); } @Test(expected = IllegalArgumentException.class) public void regular_failing_test() throws Throwable { //when rule.apply(new Statement() { public void evaluate() throws Throwable { throw new IllegalArgumentException(); } }, mock(FrameworkMethod.class), this).evaluate(); } @Test public void rule_threw_exception() throws Throwable { //expect rule.expectFailure(AssertionError.class, "x"); //when rule.apply(new Statement() { public void evaluate() throws Throwable { throw new AssertionError("x"); } }, mock(FrameworkMethod.class), this).evaluate(); } @Test public void expected_exception_but_no_exception() throws Throwable { //expect rule.expectFailure(AssertionError.class, "x"); //when try { rule.apply(new Statement() { public void evaluate() throws Throwable { //all good } }, mock(FrameworkMethod.class), this).evaluate(); fail(); //then } catch (SafeJUnitRule.ExpectedThrowableNotReported t) { //yup, expected } } @Test public void expected_exception_message_did_not_match() throws Throwable { //expect rule.expectFailure(AssertionError.class, "FOO"); //when try { rule.apply(new Statement() { public void evaluate() throws Throwable { throw new AssertionError("BAR"); } }, mock(FrameworkMethod.class), this).evaluate(); fail(); } catch (AssertionError throwable) { Assertions.assertThat(throwable).hasMessageContaining("Expecting message"); } } @Test public void expected_exception_type_did_not_match() throws Throwable { //expect rule.expectFailure(AssertionError.class, "x"); //when try { rule.apply(new Statement() { public void evaluate() throws Throwable { throw new RuntimeException("x"); } }, mock(FrameworkMethod.class), this).evaluate(); fail(); } catch (AssertionError throwable) { Assertions.assertThat(throwable).hasMessageContaining("but was instance of"); } } @Test public void expected_exception_assert_did_not_match() throws Throwable { //expect rule.expectFailure(new SafeJUnitRule.FailureAssert() { public void doAssert(Throwable t) { throw new AssertionError("x"); } }); //when try { rule.apply(new Statement() { public void evaluate() throws Throwable { throw new RuntimeException(); } }, mock(FrameworkMethod.class), this).evaluate(); fail(); } catch (AssertionError throwable) { assertEquals(throwable.getMessage(), "x"); } } private static class MethodRuleStub implements MethodRule { private boolean statementEvaluated; public Statement apply(final Statement base, FrameworkMethod method, Object target) { return new Statement() { public void evaluate() throws Throwable { statementEvaluated = true; base.evaluate(); } }; } } }