• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2007 Mockito contributors
3  * This program is made available under the terms of the MIT License.
4  */
5 package org.mockitousage.misuse;
6 
7 import static org.assertj.core.api.Assertions.assertThat;
8 import static org.junit.Assert.fail;
9 import static org.junit.Assume.assumeTrue;
10 import static org.mockito.Mockito.anyBoolean;
11 import static org.mockito.Mockito.anyInt;
12 import static org.mockito.Mockito.any;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.validateMockitoUsage;
15 import static org.mockito.Mockito.verify;
16 
17 import java.util.Observer;
18 
19 import org.junit.After;
20 import org.junit.Test;
21 import org.mockito.Mock;
22 import org.mockito.exceptions.misusing.InvalidUseOfMatchersException;
23 import org.mockito.exceptions.misusing.UnfinishedVerificationException;
24 import org.mockitousage.IMethods;
25 import org.mockitoutil.TestBase;
26 
27 public class DetectingMisusedMatchersTest extends TestBase {
28 
29     class WithFinal {
finalMethod(Object object)30         final Object finalMethod(Object object) {
31             return null;
32         }
33     }
34 
35     @Mock private WithFinal withFinal;
36 
37     @After
resetState()38     public void resetState() {
39         super.resetState();
40     }
41 
misplaced_any_argument_matcher()42     private void misplaced_any_argument_matcher() {
43         Object ignored = any();
44     }
45 
misplaced_anyInt_argument_matcher()46     private void misplaced_anyInt_argument_matcher() {
47         int ignored = anyInt();
48     }
49 
misplaced_anyBoolean_argument_matcher()50     private void misplaced_anyBoolean_argument_matcher() {
51         boolean ignored = anyBoolean();
52     }
53 
54     @Test
should_fail_fast_when_argument_matchers_are_abused()55     public void should_fail_fast_when_argument_matchers_are_abused() {
56         misplaced_any_argument_matcher();
57         try {
58             mock(IMethods.class);
59             fail();
60         } catch (InvalidUseOfMatchersException e) {
61             assertThat(e).hasMessageContaining("Misplaced or misused argument matcher");
62         }
63     }
64 
65     @Test
should_report_argument_locations_when_argument_matchers_misused()66     public void should_report_argument_locations_when_argument_matchers_misused() {
67         try {
68             Observer observer = mock(Observer.class);
69 
70             misplaced_anyInt_argument_matcher();
71             misplaced_any_argument_matcher();
72             misplaced_anyBoolean_argument_matcher();
73 
74             observer.update(null, null);
75 
76             validateMockitoUsage();
77             fail();
78         } catch (InvalidUseOfMatchersException e) {
79             assertThat(e)
80                     .hasMessageContaining(
81                             "DetectingMisusedMatchersTest.misplaced_anyInt_argument_matcher")
82                     .hasMessageContaining(
83                             "DetectingMisusedMatchersTest.misplaced_any_argument_matcher")
84                     .hasMessageContaining(
85                             "DetectingMisusedMatchersTest.misplaced_anyBoolean_argument_matcher");
86         }
87     }
88 
89     @SuppressWarnings({"MockitoUsage", "CheckReturnValue"})
90     @Test
shouldSayUnfinishedVerificationButNotInvalidUseOfMatchers()91     public void shouldSayUnfinishedVerificationButNotInvalidUseOfMatchers() {
92         assumeTrue("Does not apply for inline mocks", withFinal.getClass() != WithFinal.class);
93         verify(withFinal).finalMethod(any());
94         try {
95             verify(withFinal);
96             fail();
97         } catch (UnfinishedVerificationException e) {
98         }
99     }
100 }
101