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