| /* |
| * Copyright (c) 2007 Mockito contributors |
| * This program is made available under the terms of the MIT License. |
| */ |
| package org.mockitousage.misuse; |
| |
| import java.util.Observer; |
| import org.junit.After; |
| import org.junit.Test; |
| import org.mockito.Mock; |
| import org.mockito.exceptions.misusing.InvalidUseOfMatchersException; |
| import org.mockito.exceptions.misusing.UnfinishedVerificationException; |
| import org.mockitousage.IMethods; |
| import org.mockitoutil.TestBase; |
| |
| import static junit.framework.TestCase.fail; |
| import static org.assertj.core.api.Assertions.assertThat; |
| import static org.junit.Assume.assumeTrue; |
| import static org.mockito.Mockito.anyBoolean; |
| import static org.mockito.Mockito.anyInt; |
| import static org.mockito.Mockito.anyObject; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.validateMockitoUsage; |
| import static org.mockito.Mockito.verify; |
| |
| public class DetectingMisusedMatchersTest extends TestBase { |
| |
| class WithFinal { |
| final Object finalMethod(Object object) { |
| return null; |
| } |
| } |
| |
| @Mock private WithFinal withFinal; |
| |
| @After |
| public void resetState() { |
| super.resetState(); |
| } |
| |
| private void misplaced_anyObject_argument_matcher() { |
| anyObject(); |
| } |
| |
| private void misplaced_anyInt_argument_matcher() { |
| anyInt(); |
| } |
| |
| private void misplaced_anyBoolean_argument_matcher() { |
| anyBoolean(); |
| } |
| |
| @Test |
| public void should_fail_fast_when_argument_matchers_are_abused() { |
| misplaced_anyObject_argument_matcher(); |
| try { |
| mock(IMethods.class); |
| fail(); |
| } catch (InvalidUseOfMatchersException e) { |
| assertThat(e).hasMessageContaining("Misplaced or misused argument matcher"); |
| } |
| } |
| |
| @Test |
| public void should_report_argument_locations_when_argument_matchers_misused() { |
| try { |
| Observer observer = mock(Observer.class); |
| |
| misplaced_anyInt_argument_matcher(); |
| misplaced_anyObject_argument_matcher(); |
| misplaced_anyBoolean_argument_matcher(); |
| |
| observer.update(null, null); |
| |
| validateMockitoUsage(); |
| fail(); |
| } catch (InvalidUseOfMatchersException e) { |
| assertThat(e) |
| .hasMessageContaining("DetectingMisusedMatchersTest.misplaced_anyInt_argument_matcher") |
| .hasMessageContaining("DetectingMisusedMatchersTest.misplaced_anyObject_argument_matcher") |
| .hasMessageContaining("DetectingMisusedMatchersTest.misplaced_anyBoolean_argument_matcher"); |
| } |
| } |
| |
| |
| @Test |
| public void shouldSayUnfinishedVerificationButNotInvalidUseOfMatchers() { |
| assumeTrue("Does not apply for inline mocks", withFinal.getClass() != WithFinal.class); |
| verify(withFinal).finalMethod(anyObject()); |
| try { |
| verify(withFinal); |
| fail(); |
| } catch (UnfinishedVerificationException e) {} |
| } |
| } |