1 package org.mockitousage.stubbing; 2 3 import org.junit.After; 4 import org.junit.Test; 5 import org.junit.runner.JUnitCore; 6 import org.junit.runner.Result; 7 import org.mockito.Mock; 8 import org.mockito.Mockito; 9 import org.mockito.MockitoSession; 10 import org.mockito.StateMaster; 11 import org.mockito.exceptions.misusing.PotentialStubbingProblem; 12 import org.mockito.exceptions.misusing.UnfinishedMockingSessionException; 13 import org.mockito.exceptions.misusing.UnnecessaryStubbingException; 14 import org.mockito.quality.Strictness; 15 import org.mockitousage.IMethods; 16 17 import java.util.Map; 18 import java.util.concurrent.ConcurrentHashMap; 19 20 import static org.mockito.BDDMockito.given; 21 import static org.mockitoutil.ConcurrentTesting.concurrently; 22 import static org.mockitoutil.JUnitResultAssert.assertThat; 23 24 public class StrictStubbingEndToEndTest { 25 26 JUnitCore junit = new JUnitCore(); 27 after()28 @After public void after() { 29 new StateMaster().clearMockitoListeners(); 30 } 31 finish_mocking_exception_does_not_hide_the_exception_from_test()32 @Test public void finish_mocking_exception_does_not_hide_the_exception_from_test() { 33 Result result = junit.run(UnnecessaryStubbing.class); 34 assertThat(result) 35 //both exceptions are reported to JUnit: 36 .fails("unnecessary_stubbing", IllegalStateException.class) 37 .fails("unnecessary_stubbing", UnnecessaryStubbingException.class); 38 } 39 does_not_report_unused_stubbing_if_mismatch_reported()40 @Test public void does_not_report_unused_stubbing_if_mismatch_reported() { 41 Result result = junit.run(ReportMismatchButNotUnusedStubbing.class); 42 assertThat(result).fails(1, PotentialStubbingProblem.class); 43 } 44 strict_stubbing_does_not_leak_to_other_tests()45 @Test public void strict_stubbing_does_not_leak_to_other_tests() { 46 Result result = junit.run(LenientStrictness1.class, StrictStubsPassing.class, LenientStrictness2.class); 47 //all tests pass, lenient test cases contain incorrect stubbing 48 assertThat(result).succeeds(5); 49 } 50 detects_unfinished_session()51 @Test public void detects_unfinished_session() { 52 Result result = junit.run(UnfinishedMocking.class); 53 assertThat(result) 54 .fails(UnfinishedMockingSessionException.class, "\n" + 55 "Unfinished mocking session detected.\n" + 56 "Previous MockitoSession was not concluded with 'finishMocking()'.\n" + 57 "For examples of correct usage see javadoc for MockitoSession class."); 58 } 59 concurrent_sessions_in_different_threads()60 @Test public void concurrent_sessions_in_different_threads() throws Exception { 61 final Map<Class, Result> results = new ConcurrentHashMap<Class, Result>(); 62 concurrently(new Runnable() { 63 public void run() { 64 results.put(StrictStubsPassing.class, junit.run(StrictStubsPassing.class)); 65 } 66 }, new Runnable() { 67 public void run() { 68 results.put(ReportMismatchButNotUnusedStubbing.class, junit.run(ReportMismatchButNotUnusedStubbing.class)); 69 } 70 } 71 ); 72 73 assertThat(results.get(StrictStubsPassing.class)).succeeds(1); 74 assertThat(results.get(ReportMismatchButNotUnusedStubbing.class)).fails(1); 75 } 76 77 public static class UnnecessaryStubbing { 78 @Mock IMethods mock; 79 MockitoSession mockito = Mockito.mockitoSession().initMocks(this).strictness(Strictness.STRICT_STUBS).startMocking(); 80 after()81 @After public void after() { 82 mockito.finishMocking(); 83 } 84 unnecessary_stubbing()85 @Test public void unnecessary_stubbing() { 86 given(mock.simpleMethod("1")).willReturn("one"); 87 throw new IllegalStateException(); 88 } 89 } 90 91 public static class ReportMismatchButNotUnusedStubbing { 92 @Mock IMethods mock; 93 MockitoSession mockito = Mockito.mockitoSession().initMocks(this).strictness(Strictness.STRICT_STUBS).startMocking(); 94 after()95 @After public void after() { 96 mockito.finishMocking(); 97 } 98 mismatch()99 @Test public void mismatch() { 100 given(mock.simpleMethod(1)).willReturn(""); 101 mock.simpleMethod(2); 102 } 103 } 104 105 public static class StrictStubsPassing { 106 @Mock IMethods mock; 107 MockitoSession mockito = Mockito.mockitoSession().initMocks(this).strictness(Strictness.STRICT_STUBS).startMocking(); 108 after()109 @After public void after() { 110 mockito.finishMocking(); 111 } 112 used()113 @Test public void used() { 114 given(mock.simpleMethod(1)).willReturn(""); 115 mock.simpleMethod(1); 116 } 117 } 118 119 public static class LenientStrictness1 { 120 @Mock IMethods mock = Mockito.mock(IMethods.class); 121 unused()122 @Test public void unused() { 123 given(mock.simpleMethod(1)).willReturn(""); 124 } 125 mismatch()126 @Test public void mismatch() { 127 given(mock.simpleMethod(2)).willReturn(""); 128 mock.simpleMethod(3); 129 } 130 } 131 132 public static class LenientStrictness2 { 133 @Mock IMethods mock = Mockito.mock(IMethods.class); 134 unused()135 @Test public void unused() { 136 given(mock.simpleMethod(1)).willReturn(""); 137 } 138 mismatch()139 @Test public void mismatch() { 140 given(mock.simpleMethod(2)).willReturn(""); 141 mock.simpleMethod(3); 142 } 143 } 144 145 public static class UnfinishedMocking { 146 @Mock IMethods mock; 147 MockitoSession mockito = Mockito.mockitoSession().initMocks(this).strictness(Strictness.STRICT_STUBS).startMocking(); 148 unused()149 @Test public void unused() { 150 given(mock.simpleMethod("1")).willReturn("one"); 151 } 152 unused2()153 @Test public void unused2() { 154 given(mock.simpleMethod("1")).willReturn("one"); 155 } 156 } 157 } 158