package org.mockitousage.junitrule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.mockito.exceptions.base.MockitoAssertionError; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.VerificationCollector; import org.mockitousage.IMethods; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; import static org.mockito.Mockito.*; public class VerificationCollectorImplTest { @Test public void should_not_throw_any_exceptions_when_verifications_are_succesful() { VerificationCollector collector = MockitoJUnit.collector().assertLazily(); IMethods methods = mock(IMethods.class); methods.simpleMethod(); verify(methods).simpleMethod(); collector.collectAndReport(); } @Test(expected = MockitoAssertionError.class) public void should_collect_verification_failures() { VerificationCollector collector = MockitoJUnit.collector().assertLazily(); IMethods methods = mock(IMethods.class); verify(methods).simpleMethod(); collector.collectAndReport(); } @Test public void should_collect_multiple_verification_failures() { VerificationCollector collector = MockitoJUnit.collector().assertLazily(); IMethods methods = mock(IMethods.class); verify(methods).simpleMethod(); verify(methods).byteReturningMethod(); try { collector.collectAndReport(); fail(); } catch (MockitoAssertionError error) { assertThat(error).hasMessageContaining("1. Wanted but not invoked:"); assertThat(error).hasMessageContaining("2. Wanted but not invoked:"); } } @Test public void should_only_collect_failures_ignore_succesful_verifications() { VerificationCollector collector = MockitoJUnit.collector().assertLazily(); IMethods methods = mock(IMethods.class); verify(methods, never()).simpleMethod(); verify(methods).byteReturningMethod(); this.assertAtLeastOneFailure(collector); } @Test public void should_continue_collecting_after_failing_verification() { VerificationCollector collector = MockitoJUnit.collector().assertLazily(); IMethods methods = mock(IMethods.class); methods.simpleMethod(); verify(methods).byteReturningMethod(); verify(methods).simpleMethod(); this.assertAtLeastOneFailure(collector); } private void assertAtLeastOneFailure(VerificationCollector collector) { try { collector.collectAndReport(); fail(); } catch (MockitoAssertionError error) { assertThat(error).hasMessageContaining("1. Wanted but not invoked:"); assertThat(error.getMessage()).doesNotContain("2."); } } @Test public void should_invoke_collector_rule_after_test() { JUnitCore runner = new JUnitCore(); Result result = runner.run(VerificationCollectorRuleInner.class); assertThat(result.getFailureCount()).isEqualTo(1); assertThat(result.getFailures().get(0).getMessage()).contains("1. Wanted but not invoked:"); } // This class is picked up when running a test suite using an IDE. It fails on purpose. public static class VerificationCollectorRuleInner { @Rule public VerificationCollector collector = MockitoJUnit.collector(); @Test public void should_fail() { IMethods methods = mock(IMethods.class); verify(methods).simpleMethod(); } @Test public void should_not_fail() { IMethods methods = mock(IMethods.class); methods.simpleMethod(); verify(methods).simpleMethod(); } } }