• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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