diff --git a/assertj-generator/src/main/java/org/assertj/assertions/generator/util/ClassUtil.java b/assertj-generator/src/main/java/org/assertj/assertions/generator/util/ClassUtil.java index 3454bde..557ff31 100644 --- a/assertj-generator/src/main/java/org/assertj/assertions/generator/util/ClassUtil.java +++ b/assertj-generator/src/main/java/org/assertj/assertions/generator/util/ClassUtil.java @@ -463,12 +463,13 @@ public static Set getterMethodsOf(TypeToken type, Set> inclu return filterGetterMethods(clazz.getMethods(), includeAnnotations, isClassAnnotated); } - private static Set filterGetterMethods(Method[] methods, Set> includeAnnotations, + static Set filterGetterMethods(Method[] methods, Set> includeAnnotations, boolean isClassAnnotated) { Set getters = new TreeSet<>(GETTER_COMPARATOR); for (Method method : methods) { if (isPublic(method.getModifiers()) && isNotDefinedInObjectClass(method) + && !method.isBridge() && isGetter(method, includeAnnotations, isClassAnnotated)) { getters.add(method); } diff --git a/assertj-generator/src/test/java/org/assertj/assertions/generator/util/ClassUtilTest.java b/assertj-generator/src/test/java/org/assertj/assertions/generator/util/ClassUtilTest.java index 4ea9775..ae7ef58 100644 --- a/assertj-generator/src/test/java/org/assertj/assertions/generator/util/ClassUtilTest.java +++ b/assertj-generator/src/test/java/org/assertj/assertions/generator/util/ClassUtilTest.java @@ -50,11 +50,13 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; +import java.util.Arrays; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.function.Predicate; import static java.util.Arrays.asList; import static org.assertj.assertions.generator.util.ClassUtil.collectClasses; @@ -77,6 +79,7 @@ import static org.assertj.assertions.generator.util.ClassUtil.propertyNameOf; import static org.assertj.assertions.generator.util.ClassUtil.resolveTypeNameInPackage; import static org.assertj.assertions.generator.util.ClassUtil.visibilityOf; +import static org.assertj.assertions.generator.util.ClassUtil.filterGetterMethods; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; @@ -276,6 +279,22 @@ void should_return_property_name_from_getter_method_name() throws Exception { assertThat(getterProperty("get")).isEqualTo("get"); } + @Test + void should_not_return_getter_bridge_methods() throws Exception { + Method[] methods = ConcreteClass.class.getDeclaredMethods(); + Method actualGetter = Arrays.stream(methods).filter(Predicate.not(Method::isBridge)).findFirst().orElseThrow(); + Method bridgeGetter = Arrays.stream(methods).filter(Method::isBridge).findFirst().orElseThrow(); + + Method[] methodsActualFirst = new Method[] { actualGetter, bridgeGetter }; + Method[] methodsBridgeFirst = new Method[] { bridgeGetter, actualGetter }; + + Set getterMethods1 = filterGetterMethods(methodsActualFirst, Collections.emptySet(), false); + assertThat(getterMethods1).singleElement().extracting(Method::getReturnType).isEqualTo(String.class); + + Set getterMethods2 = filterGetterMethods(methodsBridgeFirst, Collections.emptySet(), false); + assertThat(getterMethods2).singleElement().extracting(Method::getReturnType).isEqualTo(String.class); + } + @ParameterizedTest @FieldSource("NESTED_CLASSES") void should_return_inner_class_name_with_outer_class_name(NestedClass nestedClass) { @@ -476,4 +495,14 @@ public T getNumber() { return null; } } + + private static abstract class AbstractClassWithGeneric { + public abstract T getValue(); + } + private static class ConcreteClass extends AbstractClassWithGeneric { + @Override + public String getValue() { + return null; + } + } }