1 /* 2 * Copyright (c) 2017 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 package org.mockitousage.junitrule; 6 7 import org.junit.Rule; 8 import org.junit.Test; 9 import org.junit.runner.JUnitCore; 10 import org.junit.runner.Result; 11 import org.mockito.exceptions.base.MockitoAssertionError; 12 import org.mockito.junit.MockitoJUnit; 13 import org.mockito.junit.VerificationCollector; 14 import org.mockitousage.IMethods; 15 16 import static org.assertj.core.api.Assertions.assertThat; 17 import static org.junit.Assert.fail; 18 import static org.mockito.Mockito.*; 19 20 public class VerificationCollectorImplTest { 21 22 @Test 23 public void should_not_throw_any_exceptions_when_verifications_are_successful() { 24 VerificationCollector collector = MockitoJUnit.collector().assertLazily(); 25 26 IMethods methods = mock(IMethods.class); 27 methods.simpleMethod(); 28 29 verify(methods).simpleMethod(); 30 collector.collectAndReport(); 31 } 32 33 @Test(expected = MockitoAssertionError.class) 34 public void should_collect_verification_failures() { 35 VerificationCollector collector = MockitoJUnit.collector().assertLazily(); 36 37 IMethods methods = mock(IMethods.class); 38 39 verify(methods).simpleMethod(); 40 collector.collectAndReport(); 41 } 42 43 @Test 44 public void should_collect_multiple_verification_failures() { 45 VerificationCollector collector = MockitoJUnit.collector().assertLazily(); 46 47 IMethods methods = mock(IMethods.class); 48 49 verify(methods).simpleMethod(); 50 verify(methods).byteReturningMethod(); 51 try { 52 collector.collectAndReport(); 53 fail(); 54 } catch (MockitoAssertionError error) { 55 assertThat(error).hasMessageContaining("1. Wanted but not invoked:"); 56 assertThat(error).hasMessageContaining("2. Wanted but not invoked:"); 57 } 58 } 59 60 @Test 61 public void should_only_collect_failures_ignore_successful_verifications() { 62 VerificationCollector collector = MockitoJUnit.collector().assertLazily(); 63 64 IMethods methods = mock(IMethods.class); 65 66 verify(methods, never()).simpleMethod(); 67 verify(methods).byteReturningMethod(); 68 69 this.assertAtLeastOneFailure(collector); 70 } 71 72 @Test 73 public void should_continue_collecting_after_failing_verification() { 74 VerificationCollector collector = MockitoJUnit.collector().assertLazily(); 75 76 IMethods methods = mock(IMethods.class); 77 methods.simpleMethod(); 78 79 verify(methods).byteReturningMethod(); 80 verify(methods).simpleMethod(); 81 82 this.assertAtLeastOneFailure(collector); 83 } 84 85 private void assertAtLeastOneFailure(VerificationCollector collector) { 86 try { 87 collector.collectAndReport(); 88 fail(); 89 } catch (MockitoAssertionError error) { 90 assertThat(error).hasMessageContaining("1. Wanted but not invoked:"); 91 assertThat(error.getMessage()).doesNotContain("2."); 92 } 93 } 94 95 @Test 96 public void should_invoke_collector_rule_after_test() { 97 JUnitCore runner = new JUnitCore(); 98 Result result = runner.run(VerificationCollectorRuleInner.class); 99 100 assertThat(result.getFailureCount()).isEqualTo(1); 101 assertThat(result.getFailures().get(0).getMessage()).contains("1. Wanted but not invoked:"); 102 } 103 104 // This class is picked up when running a test suite using an IDE. It fails on purpose. 105 public static class VerificationCollectorRuleInner { 106 107 @Rule 108 public VerificationCollector collector = MockitoJUnit.collector(); 109 110 @Test 111 public void should_fail() { 112 IMethods methods = mock(IMethods.class); 113 114 verify(methods).simpleMethod(); 115 } 116 117 @Test 118 public void should_not_fail() { 119 IMethods methods = mock(IMethods.class); 120 methods.simpleMethod(); 121 122 verify(methods).simpleMethod(); 123 } 124 } 125 } 126