1 /* 2 * Copyright (c) 2007 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 6 package org.mockitousage.annotation; 7 8 import org.junit.Test; 9 import org.mockito.*; 10 import org.mockito.exceptions.base.MockitoException; 11 import org.mockitousage.IMethods; 12 import org.mockitoutil.TestBase; 13 14 import java.lang.annotation.Retention; 15 import java.lang.annotation.RetentionPolicy; 16 import java.util.ArrayList; 17 import java.util.List; 18 import java.util.Set; 19 20 import static org.junit.Assert.*; 21 import static org.assertj.core.api.Assertions.assertThat; 22 23 public class CaptorAnnotationTest extends TestBase { 24 25 @Retention(RetentionPolicy.RUNTIME) 26 public @interface NotAMock { 27 } 28 29 @Captor 30 final ArgumentCaptor<String> finalCaptor = ArgumentCaptor.forClass(String.class); 31 32 @Captor 33 ArgumentCaptor<List<List<String>>> genericsCaptor; 34 35 @SuppressWarnings("rawtypes") 36 @Captor 37 ArgumentCaptor nonGenericCaptorIsAllowed; 38 39 @Mock 40 MockInterface mockInterface; 41 42 @NotAMock 43 Set<?> notAMock; 44 45 public interface MockInterface { testMe(String simple, List<List<String>> genericList)46 void testMe(String simple, List<List<String>> genericList); 47 } 48 49 @Test testNormalUsage()50 public void testNormalUsage() { 51 52 MockitoAnnotations.initMocks(this); 53 54 // check if assigned correctly 55 assertNotNull(finalCaptor); 56 assertNotNull(genericsCaptor); 57 assertNotNull(nonGenericCaptorIsAllowed); 58 assertNull(notAMock); 59 60 // use captors in the field to be sure they are cool 61 String argForFinalCaptor = "Hello"; 62 ArrayList<List<String>> argForGenericsCaptor = new ArrayList<List<String>>(); 63 64 mockInterface.testMe(argForFinalCaptor, argForGenericsCaptor); 65 66 Mockito.verify(mockInterface).testMe(finalCaptor.capture(), genericsCaptor.capture()); 67 68 assertEquals(argForFinalCaptor, finalCaptor.getValue()); 69 assertEquals(argForGenericsCaptor, genericsCaptor.getValue()); 70 71 } 72 73 public static class WrongType { 74 @Captor 75 List<?> wrongType; 76 } 77 78 @Test shouldScreamWhenWrongTypeForCaptor()79 public void shouldScreamWhenWrongTypeForCaptor() { 80 try { 81 MockitoAnnotations.initMocks(new WrongType()); 82 fail(); 83 } catch (MockitoException e) {} 84 } 85 86 public static class ToManyAnnotations { 87 @Captor 88 @Mock 89 ArgumentCaptor<List> missingGenericsField; 90 } 91 92 @Test shouldScreamWhenMoreThanOneMockitoAnnotation()93 public void shouldScreamWhenMoreThanOneMockitoAnnotation() { 94 try { 95 MockitoAnnotations.initMocks(new ToManyAnnotations()); 96 fail(); 97 } catch (MockitoException e) { 98 assertThat(e) 99 .hasMessageContaining("missingGenericsField") 100 .hasMessageContaining("multiple Mockito annotations"); 101 } 102 } 103 104 @Test shouldScreamWhenInitializingCaptorsForNullClass()105 public void shouldScreamWhenInitializingCaptorsForNullClass() throws Exception { 106 try { 107 MockitoAnnotations.initMocks(null); 108 fail(); 109 } catch (MockitoException e) { 110 } 111 } 112 113 @Test shouldLookForAnnotatedCaptorsInSuperClasses()114 public void shouldLookForAnnotatedCaptorsInSuperClasses() throws Exception { 115 Sub sub = new Sub(); 116 MockitoAnnotations.initMocks(sub); 117 118 assertNotNull(sub.getCaptor()); 119 assertNotNull(sub.getBaseCaptor()); 120 assertNotNull(sub.getSuperBaseCaptor()); 121 } 122 123 class SuperBase { 124 @Captor 125 private ArgumentCaptor<IMethods> mock; 126 getSuperBaseCaptor()127 public ArgumentCaptor<IMethods> getSuperBaseCaptor() { 128 return mock; 129 } 130 } 131 132 class Base extends SuperBase { 133 @Captor 134 private ArgumentCaptor<IMethods> mock; 135 getBaseCaptor()136 public ArgumentCaptor<IMethods> getBaseCaptor() { 137 return mock; 138 } 139 } 140 141 class Sub extends Base { 142 @Captor 143 private ArgumentCaptor<IMethods> mock; 144 getCaptor()145 public ArgumentCaptor<IMethods> getCaptor() { 146 return mock; 147 } 148 } 149 } 150