diff --git a/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java b/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java index d91f3484a..ff0d7126f 100755 --- a/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java +++ b/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java @@ -409,6 +409,40 @@ public class ClassTypeInformationUnitTests { assertThat(property.specialize(concrete)).isEqualTo(concrete); } + @Test // DATACMNS-1571 + public void considersGenericsOfTypeToSpecializeToIfFullyResolved() { + + TypeInformation storeEvent = ClassTypeInformation.from(StoredEvent.class); + assertThat(storeEvent.getType()).isEqualTo(StoredEvent.class); + + TypeInformation domainEvent = (TypeInformation) storeEvent.getProperty("event"); + assertThat(domainEvent.getType()).isEqualTo(DomainEvent.class); + + TypeInformation specialized = domainEvent + .specialize(ClassTypeInformation.from(OfferCreated.class)); + + assertThat(specialized.getType()).isEqualTo(OfferCreated.class); + assertThat(specialized.getProperty("aggregateId").getType()).isEqualTo(Long.class); + assertThat(specialized.getProperty("root").getType()).isEqualTo(OfferDetails.class); + } + + @Test // DATACMNS-1571 + public void mergesGenericsFromContextAndProvidedDefaultOnSpecialization() { + + TypeInformation storeEvent = ClassTypeInformation.from(StoredEvent.class); + assertThat(storeEvent.getType()).isEqualTo(StoredEvent.class); + + TypeInformation domainEvent = (TypeInformation) storeEvent.getProperty("event"); + assertThat(domainEvent.getType()).isEqualTo(DomainEvent.class); + + TypeInformation specialized = domainEvent + .specialize(ClassTypeInformation.from(GenericEvent.class)); + + assertThat(specialized.getType()).isEqualTo(GenericEvent.class); + assertThat(specialized.getProperty("aggregateId").getType()).isEqualTo(Long.class); + assertThat(specialized.getProperty("root").getType()).isEqualTo(Aggregate.class); + } + static class StringMapContainer extends MapContainer { } @@ -623,4 +657,28 @@ public class ClassTypeInformationUnitTests { static class WildcardedWrapper { SomeGeneric wildcarded; } + + // DATACMNS-1571 + + interface Aggregate {} + + static class StoredEvent { + DomainEvent event; + } + + static abstract class DomainEvent { + + ID aggregateId; + T root; + } + + static class OfferDetails implements Aggregate { + String name; + } + + // A domain type fully binding all generics + static class OfferCreated extends DomainEvent {} + + // A domain type partially binding generics + static class GenericEvent extends DomainEvent {} }