1 /* 2 * Copyright (c) 2018 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 package org.mockitousage.stubbing; 6 7 import static java.util.Collections.singletonList; 8 import static org.assertj.core.api.Assertions.assertThatThrownBy; 9 import static org.junit.Assert.assertEquals; 10 import static org.mockito.BDDMockito.given; 11 import static org.mockito.Mockito.verify; 12 import static org.mockitoutil.TestBase.filterLineNo; 13 14 import org.junit.After; 15 import org.junit.Test; 16 import org.mockito.Mock; 17 import org.mockito.MockitoSession; 18 import org.mockito.StateMaster; 19 import org.mockito.exceptions.base.MockitoException; 20 import org.mockito.internal.framework.DefaultMockitoSession; 21 import org.mockito.internal.util.SimpleMockitoLogger; 22 import org.mockito.quality.Strictness; 23 import org.mockitousage.IMethods; 24 25 public class StubbingWarningsTest { 26 27 private static final String TEST_NAME = "test.name"; 28 29 @Mock IMethods mock; 30 31 SimpleMockitoLogger logger = new SimpleMockitoLogger(); 32 MockitoSession mockito = 33 new DefaultMockitoSession( 34 singletonList((Object) this), TEST_NAME, Strictness.WARN, logger); 35 36 @After after()37 public void after() { 38 StateMaster stateMaster = new StateMaster(); 39 stateMaster.reset(); 40 stateMaster.clearMockitoListeners(); 41 } 42 43 @Test few_interactions()44 public void few_interactions() { 45 // when 46 mock.simpleMethod(100); 47 mock.otherMethod(); 48 49 // expect no exception 50 mockito.finishMocking(); 51 logger.assertEmpty(); 52 } 53 54 @Test stubbing_used()55 public void stubbing_used() { 56 // when 57 given(mock.simpleMethod(100)).willReturn("100"); 58 mock.simpleMethod(100); 59 60 // then 61 mockito.finishMocking(); 62 logger.assertEmpty(); 63 } 64 65 @Test unused_stubbed_is_not_implicitly_verified()66 public void unused_stubbed_is_not_implicitly_verified() { 67 // when 68 given(mock.simpleMethod(100)).willReturn("100"); 69 mock.simpleMethod(100); // <- stubbing is used 70 mock.simpleMethod(200); // <- other method should not generate arg mismatch 71 72 // then 73 mockito.finishMocking(); 74 logger.assertEmpty(); 75 } 76 77 @Test stubbing_argument_mismatch()78 public void stubbing_argument_mismatch() { 79 // when 80 given(mock.simpleMethod(100)).willReturn("100"); 81 mock.simpleMethod(200); 82 83 mockito.finishMocking(); 84 85 // TODO - currently we warn about "Unused" instead of "Arg mismatch" below 86 // because it was simpler to implement. This can be improved given we put priority to 87 // improve the warnings. 88 // then 89 assertEquals( 90 filterLineNo( 91 "[MockitoHint] " 92 + TEST_NAME 93 + " (see javadoc for MockitoHint):\n" 94 + "[MockitoHint] 1. Unused -> at org.mockitousage.stubbing.StubbingWarningsTest.stubbing_argument_mismatch(StubbingWarningsTest.java:0)\n"), 95 filterLineNo(logger.getLoggedInfo())); 96 } 97 98 @Test unused_stubbing()99 public void unused_stubbing() { 100 // when 101 given(mock.simpleMethod(100)).willReturn("100"); 102 103 mockito.finishMocking(); 104 105 // then 106 assertEquals( 107 filterLineNo( 108 "[MockitoHint] " 109 + TEST_NAME 110 + " (see javadoc for MockitoHint):\n" 111 + "[MockitoHint] 1. Unused -> at org.mockitousage.stubbing.StubbingWarningsTest.unused_stubbing(StubbingWarningsTest.java:0)\n"), 112 filterLineNo(logger.getLoggedInfo())); 113 } 114 115 @SuppressWarnings({"MockitoUsage", "CheckReturnValue"}) 116 @Test unfinished_verification_without_throwable()117 public void unfinished_verification_without_throwable() { 118 // when 119 verify(mock); 120 121 assertThatThrownBy( 122 () -> { 123 mockito.finishMocking(); 124 }) 125 .isInstanceOf(MockitoException.class) 126 .hasMessageContainingAll( 127 "Missing method call for verify(mock) here:", 128 "-> at", 129 "Example of correct verification:", 130 " verify(mock).doSomething()", 131 "Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.", 132 "Those methods *cannot* be stubbed/verified.", 133 "Mocking methods declared on non-public parent classes is not supported."); 134 } 135 136 @SuppressWarnings({"MockitoUsage", "CheckReturnValue"}) 137 @Test unfinished_verification_with_throwable()138 public void unfinished_verification_with_throwable() { 139 // when 140 verify(mock); 141 142 mockito.finishMocking(new AssertionError()); 143 144 // then 145 logger.assertEmpty(); 146 } 147 } 148