• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.session;
6 
7 import static org.junit.Assert.assertEquals;
8 import static org.junit.Assert.assertNotNull;
9 import static org.junit.Assert.assertNull;
10 import static org.junit.Assert.assertTrue;
11 import static org.mockito.Mockito.mockingDetails;
12 import static org.mockito.Mockito.verify;
13 import static org.mockito.Mockito.when;
14 
15 import org.junit.After;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.junit.runner.JUnitCore;
19 import org.junit.runner.Result;
20 import org.mockito.InjectMocks;
21 import org.mockito.Mock;
22 import org.mockito.Mockito;
23 import org.mockito.MockitoSession;
24 import org.mockito.exceptions.misusing.InjectMocksException;
25 import org.mockito.exceptions.misusing.UnfinishedStubbingException;
26 import org.mockito.quality.Strictness;
27 import org.mockitousage.IMethods;
28 import org.mockitoutil.JUnitResultAssert;
29 import org.mockitoutil.TestBase;
30 
31 public class MockitoSessionTest extends TestBase {
32 
33     private JUnitCore junit = new JUnitCore();
34 
35     @Test
session_without_any_configuration()36     public void session_without_any_configuration() {
37         // when
38         Result result = junit.run(MockitoSessionTest.SessionWithoutAnyConfiguration.class);
39 
40         // expect
41         JUnitResultAssert.assertThat(result).succeeds(1);
42     }
43 
44     @Test
session_without_init_mocks_configured()45     public void session_without_init_mocks_configured() {
46         // when
47         Result result = junit.run(MockitoSessionTest.SessionWithoutInitMocksConfigured.class);
48 
49         // expect
50         JUnitResultAssert.assertThat(result).succeeds(1);
51     }
52 
53     @Test
session_without_strictness_configured()54     public void session_without_strictness_configured() {
55         // when
56         Result result = junit.run(MockitoSessionTest.SessionWithoutStrictnessConfigured.class);
57 
58         // expect
59         JUnitResultAssert.assertThat(result).succeeds(1);
60     }
61 
62     @Test
session_with_incorrect_mockito_usage()63     public void session_with_incorrect_mockito_usage() {
64         // when
65         Result result = junit.run(MockitoSessionTest.SessionWithIncorrectMockitoUsage.class);
66 
67         // expect
68         JUnitResultAssert.assertThat(result).fails(1, UnfinishedStubbingException.class);
69     }
70 
71     @Test
reports_other_failure_and_incorrect_mockito_usage()72     public void reports_other_failure_and_incorrect_mockito_usage() {
73         // when
74         Result result =
75                 junit.run(MockitoSessionTest.SessionWithTestFailureAndIncorrectMockitoUsage.class);
76 
77         // expect
78         JUnitResultAssert.assertThat(result)
79                 .failsExactly(AssertionError.class, UnfinishedStubbingException.class);
80     }
81 
82     @Test
allows_initializing_mocks_manually()83     public void allows_initializing_mocks_manually() {
84         // when
85         Result result = junit.run(MockitoSessionTest.SessionWithManuallyInitializedMock.class);
86 
87         // expect
88         JUnitResultAssert.assertThat(result).succeeds(1);
89     }
90 
91     @Test
allows_updating_strictness()92     public void allows_updating_strictness() {
93         // when
94         Result result = junit.run(MockitoSessionTest.SessionWithUpdatedStrictness.class);
95 
96         // expect
97         JUnitResultAssert.assertThat(result).succeeds(1);
98     }
99 
100     @Test
allows_overriding_failure()101     public void allows_overriding_failure() {
102         // when
103         Result result = junit.run(MockitoSessionTest.SessionWithOverriddenFailure.class);
104 
105         // expect
106         JUnitResultAssert.assertThat(result).isSuccessful();
107 
108         // in order to demonstrate feature, we intentionally misuse Mockito and need to clean up
109         // state
110         resetState();
111     }
112 
113     @Test
cleans_up_state_when_init_fails()114     public void cleans_up_state_when_init_fails() {
115         // when
116         Result result = junit.run(MockitoSessionTest.SessionWithInitMocksFailure.class);
117 
118         // expect that both failures are the same, indicating correct listener cleanup
119         // incorrect cleanup causes 1 failure to be InjectMocksException
120         //  but the next test method would have failed with unuseful error that session was not
121         // cleaned up
122         JUnitResultAssert.assertThat(result).fails(2, InjectMocksException.class);
123     }
124 
125     public static class SessionWithoutAnyConfiguration {
126 
127         @Mock IMethods mock;
128 
129         // session without initMocks is not currently supported
130         MockitoSession mockito = Mockito.mockitoSession().startMocking();
131 
132         @After
after()133         public void after() {
134             mockito.finishMocking();
135         }
136 
137         @Test
some_test()138         public void some_test() {
139             assertNull(mock); // initMocks() was not used when configuring session
140         }
141     }
142 
143     public static class SessionWithoutInitMocksConfigured {
144 
145         @Mock IMethods mock;
146 
147         MockitoSession mockito =
148                 Mockito.mockitoSession().strictness(Strictness.LENIENT).startMocking();
149 
150         @After
after()151         public void after() {
152             mockito.finishMocking();
153         }
154 
155         @Test
some_test()156         public void some_test() {
157             assertNull(mock); // initMocks() was not used when configuring session
158         }
159     }
160 
161     public static class SessionWithoutStrictnessConfigured {
162         @Mock IMethods mock;
163 
164         MockitoSession mockito = Mockito.mockitoSession().initMocks(this).startMocking();
165 
166         @After
after()167         public void after() {
168             mockito.finishMocking();
169         }
170 
171         @Test
some_test()172         public void some_test() {
173             assertNotNull(mock);
174         }
175     }
176 
177     public static class SessionWithIncorrectMockitoUsage {
178         @Mock IMethods mock;
179 
180         MockitoSession mockito = Mockito.mockitoSession().initMocks(this).startMocking();
181 
182         @After
after()183         public void after() {
184             mockito.finishMocking();
185         }
186 
187         @SuppressWarnings({"MockitoUsage", "CheckReturnValue"})
188         @Test
unfinished_stubbing()189         public void unfinished_stubbing() {
190             when(mock.simpleMethod());
191         }
192     }
193 
194     public static class SessionWithTestFailureAndIncorrectMockitoUsage {
195         @Mock IMethods mock;
196 
197         MockitoSession mockito = Mockito.mockitoSession().initMocks(this).startMocking();
198 
199         @After
after()200         public void after() {
201             mockito.finishMocking();
202         }
203 
204         @SuppressWarnings({"MockitoUsage", "CheckReturnValue"})
205         @Test
unfinished_stubbing_with_other_failure()206         public void unfinished_stubbing_with_other_failure() {
207             when(mock.simpleMethod());
208             assertTrue(false);
209         }
210     }
211 
212     public static class SessionWithManuallyInitializedMock {
213         @Mock IMethods mock;
214         IMethods mock2 = Mockito.mock(IMethods.class, "manual mock");
215 
216         MockitoSession mockito = Mockito.mockitoSession().initMocks(this).startMocking();
217 
218         @After
after()219         public void after() {
220             mockito.finishMocking();
221         }
222 
223         @Test
manual_mock_preserves_its_settings()224         public void manual_mock_preserves_its_settings() {
225             assertEquals(
226                     "mock",
227                     mockingDetails(mock).getMockCreationSettings().getMockName().toString());
228             assertEquals(
229                     "manual mock",
230                     mockingDetails(mock2).getMockCreationSettings().getMockName().toString());
231         }
232     }
233 
234     public static class SessionWithUpdatedStrictness {
235         @Mock IMethods mock;
236         MockitoSession mockito =
237                 Mockito.mockitoSession()
238                         .initMocks(this)
239                         .strictness(Strictness.STRICT_STUBS)
240                         .startMocking();
241 
242         @After
after()243         public void after() {
244             mockito.finishMocking();
245         }
246 
247         @Test
manual_mock_preserves_its_settings()248         public void manual_mock_preserves_its_settings() {
249             when(mock.simpleMethod(1)).thenReturn("foo");
250 
251             // when
252             mockito.setStrictness(Strictness.LENIENT);
253 
254             // then no exception is thrown, even though the arg is different
255             mock.simpleMethod(2);
256         }
257     }
258 
259     public static class SessionWithOverriddenFailure {
260         @Mock IMethods mock;
261         MockitoSession mockito = Mockito.mockitoSession().initMocks(this).startMocking();
262 
263         @After
after()264         public void after() {
265             mockito.finishMocking(new RuntimeException("Boo!"));
266         }
267 
268         @SuppressWarnings({"MockitoUsage", "CheckReturnValue"})
269         @Test
invalid_mockito_usage()270         public void invalid_mockito_usage() {
271             verify(mock);
272         }
273     }
274 
275     public static class SessionWithInitMocksFailure {
276         @InjectMocks private ConstructorFail sut;
277         MockitoSession mockito;
278 
279         @Before
before()280         public void before() {
281             mockito = Mockito.mockitoSession().initMocks(this).startMocking();
282         }
283 
284         @After
after()285         public void after() {
286             if (mockito != null) {
287                 // so that we reduce amount of exceptions for easier assertions
288                 // otherwise we would get an NPE here
289                 mockito.finishMocking();
290             }
291         }
292 
293         @Test
test1()294         public void test1() {
295             // should fail the same way
296         }
297 
298         @Test
test2()299         public void test2() {
300             // should fail the same way
301         }
302 
303         static class ConstructorFail {
ConstructorFail()304             ConstructorFail() {
305                 throw new RuntimeException("Boo!");
306             }
307         }
308     }
309 }
310