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