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