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