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