• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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