/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockitousage.annotation; import org.junit.Test; import org.mockito.*; import org.mockito.exceptions.base.MockitoException; import org.mockitousage.IMethods; import org.mockitoutil.TestBase; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; import java.util.Set; import static junit.framework.TestCase.*; import static org.assertj.core.api.Assertions.assertThat; public class CaptorAnnotationTest extends TestBase { @Retention(RetentionPolicy.RUNTIME) public @interface NotAMock { } @Captor final ArgumentCaptor<String> finalCaptor = ArgumentCaptor.forClass(String.class); @Captor ArgumentCaptor<List<List<String>>> genericsCaptor; @SuppressWarnings("rawtypes") @Captor ArgumentCaptor nonGenericCaptorIsAllowed; @Mock MockInterface mockInterface; @NotAMock Set<?> notAMock; public interface MockInterface { void testMe(String simple, List<List<String>> genericList); } @Test public void testNormalUsage() { MockitoAnnotations.initMocks(this); // check if assigned correctly assertNotNull(finalCaptor); assertNotNull(genericsCaptor); assertNotNull(nonGenericCaptorIsAllowed); assertNull(notAMock); // use captors in the field to be sure they are cool String argForFinalCaptor = "Hello"; ArrayList<List<String>> argForGenericsCaptor = new ArrayList<List<String>>(); mockInterface.testMe(argForFinalCaptor, argForGenericsCaptor); Mockito.verify(mockInterface).testMe(finalCaptor.capture(), genericsCaptor.capture()); assertEquals(argForFinalCaptor, finalCaptor.getValue()); assertEquals(argForGenericsCaptor, genericsCaptor.getValue()); } public static class WrongType { @Captor List<?> wrongType; } @Test public void shouldScreamWhenWrongTypeForCaptor() { try { MockitoAnnotations.initMocks(new WrongType()); fail(); } catch (MockitoException e) {} } public static class ToManyAnnotations { @Captor @Mock ArgumentCaptor<List> missingGenericsField; } @Test public void shouldScreamWhenMoreThanOneMockitoAnnotaton() { try { MockitoAnnotations.initMocks(new ToManyAnnotations()); fail(); } catch (MockitoException e) { assertThat(e) .hasMessageContaining("missingGenericsField") .hasMessageContaining("multiple Mockito annotations"); } } @Test public void shouldScreamWhenInitializingCaptorsForNullClass() throws Exception { try { MockitoAnnotations.initMocks(null); fail(); } catch (MockitoException e) { } } @Test public void shouldLookForAnnotatedCaptorsInSuperClasses() throws Exception { Sub sub = new Sub(); MockitoAnnotations.initMocks(sub); assertNotNull(sub.getCaptor()); assertNotNull(sub.getBaseCaptor()); assertNotNull(sub.getSuperBaseCaptor()); } class SuperBase { @Captor private ArgumentCaptor<IMethods> mock; public ArgumentCaptor<IMethods> getSuperBaseCaptor() { return mock; } } class Base extends SuperBase { @Captor private ArgumentCaptor<IMethods> mock; public ArgumentCaptor<IMethods> getBaseCaptor() { return mock; } } class Sub extends Base { @Captor private ArgumentCaptor<IMethods> mock; public ArgumentCaptor<IMethods> getCaptor() { return mock; } } }