From eae634db7f493fca0778b706b487fdc6c936e196 Mon Sep 17 00:00:00 2001 From: "ah.jo" Date: Mon, 13 Jan 2025 18:18:07 +0900 Subject: [PATCH] Fix abstractExtends in InterfacePlugin does not support interface --- .../api/plugin/InterfacePlugin.java | 3 +- .../tests/java/InterfaceTestSpecs.java | 11 ++++ .../fixturemonkey/tests/java/JavaTest.java | 52 +++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/plugin/InterfacePlugin.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/plugin/InterfacePlugin.java index e7eb63035..8f79983fb 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/plugin/InterfacePlugin.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/plugin/InterfacePlugin.java @@ -125,7 +125,8 @@ public InterfacePlugin abstractClassExtends( Class abstractClassType, List> implementations ) { - if (!Modifier.isAbstract(abstractClassType.getModifiers())) { + if (!(Modifier.isAbstract(abstractClassType.getModifiers()) + && !Modifier.isInterface(abstractClassType.getModifiers()))) { throw new IllegalArgumentException( "abstractClassExtends option first parameter should be abstract class. " + abstractClassType.getTypeName() diff --git a/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/InterfaceTestSpecs.java b/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/InterfaceTestSpecs.java index 42f6f2d11..f0f6bab69 100644 --- a/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/InterfaceTestSpecs.java +++ b/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/InterfaceTestSpecs.java @@ -20,6 +20,7 @@ import java.util.List; +import lombok.EqualsAndHashCode; import lombok.Value; class InterfaceTestSpecs { @@ -61,4 +62,14 @@ public List getObject() { public static class InterfaceWrapperObject { InterfaceObject value; } + + abstract static class AbstractClassObject { + abstract Object getObject(); + } + + @EqualsAndHashCode(callSuper = true) + @Value + public static class AbstractClassStringChildObject extends AbstractClassObject { + String object; + } } diff --git a/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/JavaTest.java b/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/JavaTest.java index ffb20eef6..0b6d7c16d 100644 --- a/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/JavaTest.java +++ b/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/JavaTest.java @@ -32,6 +32,7 @@ import java.time.Instant; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -92,6 +93,8 @@ import com.navercorp.fixturemonkey.tests.java.ImmutableRecursiveTypeSpecs.SelfRecursiveListObject; import com.navercorp.fixturemonkey.tests.java.ImmutableRecursiveTypeSpecs.SelfRecursiveMapObject; import com.navercorp.fixturemonkey.tests.java.ImmutableRecursiveTypeSpecs.SelfRecursiveObject; +import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.AbstractClassObject; +import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.AbstractClassStringChildObject; import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.InterfaceIntegerObject; import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.InterfaceListObject; import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.InterfaceObject; @@ -1410,4 +1413,53 @@ void constructorValidator() { then(actual.getValue()).isEqualTo(100); } + + @RepeatedTest(TEST_COUNT) + void abstractClassExtends() { + FixtureMonkey sut = FixtureMonkey.builder() + .plugin( + new InterfacePlugin() + .abstractClassExtends( + AbstractClassObject.class, + Collections.singletonList(AbstractClassStringChildObject.class)) + ) + .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE) + .build(); + + AbstractClassObject actual = sut.giveMeOne(AbstractClassObject.class); + + then(actual).isExactlyInstanceOf(AbstractClassStringChildObject.class); + } + + @Test + void abstractExtendsInterfaceThrows() { + thenThrownBy( + () -> FixtureMonkey.builder() + .plugin( + new InterfacePlugin() + .abstractClassExtends( + InterfaceObject.class, + Collections.singletonList(InterfaceStringObject.class)) + ) + .build() + ) + .isExactlyInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("should be abstract class"); + } + + @Test + void interfaceImplementsAbstractClassThrows() { + thenThrownBy( + () -> FixtureMonkey.builder() + .plugin( + new InterfacePlugin() + .interfaceImplements( + AbstractClassObject.class, + Collections.singletonList(AbstractClassStringChildObject.class)) + ) + .build() + ) + .isExactlyInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("should be interface"); + } }