1 package org.mockito.internal.util.reflection; 2 3 import org.junit.Test; 4 import org.mockitoutil.TestBase; 5 6 import java.io.Serializable; 7 import java.util.List; 8 import java.util.Map; 9 10 import static junit.framework.TestCase.assertEquals; 11 import static org.mockito.internal.util.reflection.GenericTypeExtractor.genericTypeOf; 12 13 public class GenericTypeExtractorTest extends TestBase { 14 15 class Base<T> {} 16 static class StaticBase<T> {} 17 interface IBase<T> {} 18 interface StaticIBase<T> {} 19 20 class IntImpl extends Base<Integer> {} 21 static class StaticIntImpl extends StaticBase<Integer> {} 22 class NestedImpl extends Base<Base<String>> {} 23 class NonGeneric extends Base {} 24 25 class IIntImpl implements IBase<Integer>{} 26 class INestedImpl implements IBase<IBase<String>>{} 27 class INonGeneric implements IBase {} 28 class Mixed extends Base<Integer> implements IBase<String> {} 29 30 class Deeper extends IntImpl implements Serializable {} 31 class EvenDeeper extends Deeper implements Cloneable {} 32 interface Iface extends IBase<Integer> {} 33 interface IDeeper extends Serializable, Iface, Cloneable {} 34 35 interface Crazy extends Serializable, IDeeper, Cloneable {} 36 class Crazier extends EvenDeeper implements Crazy {} 37 38 @Test public void finds_generic_type() { 39 assertEquals(Integer.class, genericTypeOf(IntImpl.class, Base.class, IBase.class)); 40 assertEquals(Integer.class, genericTypeOf(StaticIntImpl.class, StaticBase.class, IBase.class)); 41 42 assertEquals(Object.class, genericTypeOf(NestedImpl.class, Base.class, IBase.class)); 43 assertEquals(Object.class, genericTypeOf(NonGeneric.class, Base.class, IBase.class)); 44 assertEquals(Object.class, genericTypeOf(String.class, Base.class, IBase.class)); 45 assertEquals(Object.class, genericTypeOf(String.class, List.class, Map.class)); 46 47 assertEquals(String.class, genericTypeOf(new Base<String>() {}.getClass(), Base.class, IBase.class)); 48 assertEquals(String.class, genericTypeOf(new IBase<String>() {}.getClass(), Base.class, IBase.class)); 49 assertEquals(String.class, genericTypeOf(new StaticBase<String>() {}.getClass(), StaticBase.class, IBase.class)); 50 assertEquals(String.class, genericTypeOf(new StaticIBase<String>() {}.getClass(), Base.class, StaticIBase.class)); 51 52 assertEquals(Integer.class, genericTypeOf(Mixed.class, Base.class, IBase.class)); 53 assertEquals(Integer.class, genericTypeOf(IIntImpl.class, Base.class, IBase.class)); 54 assertEquals(Object.class, genericTypeOf(INestedImpl.class, Base.class, IBase.class)); 55 assertEquals(Object.class, genericTypeOf(INonGeneric.class, IBase.class, INonGeneric.class)); 56 57 assertEquals(Integer.class, genericTypeOf(Deeper.class, Base.class, IBase.class)); 58 assertEquals(Integer.class, genericTypeOf(EvenDeeper.class, Base.class, IBase.class)); 59 assertEquals(Integer.class, genericTypeOf(Iface.class, Base.class, IBase.class)); 60 assertEquals(Integer.class, genericTypeOf(IDeeper.class, Base.class, IBase.class)); 61 assertEquals(Integer.class, genericTypeOf(Crazy.class, Base.class, IBase.class)); 62 assertEquals(Integer.class, genericTypeOf(Crazier.class, Base.class, IBase.class)); 63 } 64 } 65