From ba3cbe7244e9f6a2906914abb13511ebcbca6ad4 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 28 Jul 2011 17:46:57 +0200 Subject: [PATCH] DATACMNS-57 - TypeDiscoverer now discovers generic constructor parameters correctly. Fixed formatting for unit test as well. --- .../data/util/TypeDiscoverer.java | 2 +- .../data/util/TypeDiscovererUnitTests.java | 71 +++++++++++++------ 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/util/TypeDiscoverer.java b/spring-data-commons-core/src/main/java/org/springframework/data/util/TypeDiscoverer.java index ab74e06d7..ae7e7ea43 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/util/TypeDiscoverer.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/util/TypeDiscoverer.java @@ -127,7 +127,7 @@ class TypeDiscoverer implements TypeInformation { List> result = new ArrayList>(); - for (Class type : constructor.getParameterTypes()) { + for (Type type : constructor.getGenericParameterTypes()) { result.add(createInfo(type)); } diff --git a/spring-data-commons-core/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java b/spring-data-commons-core/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java index 859f97c75..4b8ffe780 100644 --- a/spring-data-commons-core/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java +++ b/spring-data-commons-core/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java @@ -18,9 +18,11 @@ package org.springframework.data.util; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; +import java.lang.reflect.Constructor; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.util.Collection; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Properties; @@ -37,11 +39,11 @@ import org.mockito.runners.MockitoJUnitRunner; */ @RunWith(MockitoJUnitRunner.class) public class TypeDiscovererUnitTests { - + @Mock @SuppressWarnings("rawtypes") Map firstMap; - + @Mock @SuppressWarnings("rawtypes") Map secondMap; @@ -64,7 +66,7 @@ public class TypeDiscovererUnitTests { public void isNotEqualIfTypeVariableMapsDiffer() { assertFalse(firstMap.equals(secondMap)); - + TypeDiscoverer first = new TypeDiscoverer(Object.class, firstMap); TypeDiscoverer second = new TypeDiscoverer(Object.class, secondMap); @@ -88,25 +90,41 @@ public class TypeDiscovererUnitTests { TypeInformation mapValueType = information.getProperty("map").getMapValueType(); assertEquals(mapValueType, information); } - + @Test public void returnsComponentAndValueTypesForMapExtensions() { TypeDiscoverer discoverer = new TypeDiscoverer(CustomMap.class, null); assertEquals(Locale.class, discoverer.getMapValueType().getType()); assertEquals(String.class, discoverer.getComponentType().getType()); } - - @Test - public void returnsComponentTypeForCollectionExtension() { - TypeDiscoverer discoverer = new TypeDiscoverer(CustomCollection.class, null); - assertEquals(String.class, discoverer.getComponentType().getType()); - } - - @Test - public void returnsComponentTypeForArrays() { - TypeDiscoverer discoverer = new TypeDiscoverer(String[].class, null); - assertEquals(String.class, discoverer.getComponentType().getType()); - } + + @Test + public void returnsComponentTypeForCollectionExtension() { + TypeDiscoverer discoverer = new TypeDiscoverer(CustomCollection.class, null); + assertEquals(String.class, discoverer.getComponentType().getType()); + } + + @Test + public void returnsComponentTypeForArrays() { + TypeDiscoverer discoverer = new TypeDiscoverer(String[].class, null); + assertEquals(String.class, discoverer.getComponentType().getType()); + } + + /** + * @see DATACMNS-57 + */ + @Test + @SuppressWarnings("rawtypes") + public void discoveresConstructorParameterTypesCorrectly() throws NoSuchMethodException, SecurityException { + + TypeDiscoverer discoverer = new TypeDiscoverer(GenericConstructors.class, + null); + Constructor constructor = GenericConstructors.class.getConstructor(List.class, Locale.class); + List> types = discoverer.getParameterTypes(constructor); + assertThat(types.size(), is(2)); + assertThat(types.get(0).getType(), equalTo((Class) List.class)); + assertThat(types.get(0).getComponentType().getType(), is(equalTo((Class) String.class))); + } class SelfReferencing { @@ -117,11 +135,18 @@ public class TypeDiscovererUnitTests { Map map; } - interface CustomMap extends Map { - - } - - interface CustomCollection extends Collection { - - } + interface CustomMap extends Map { + + } + + interface CustomCollection extends Collection { + + } + + public static class GenericConstructors { + + public GenericConstructors(List first, Locale second) { + + } + } }