Skip to content

Commit 7a67237

Browse files
authored
Fix abstractExtends in InterfacePlugin does not support interface (#1144)
1 parent dcd98dd commit 7a67237

File tree

3 files changed

+65
-1
lines changed

3 files changed

+65
-1
lines changed

fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/plugin/InterfacePlugin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ public <T> InterfacePlugin abstractClassExtends(
125125
Class<T> abstractClassType,
126126
List<Class<? extends T>> implementations
127127
) {
128-
if (!Modifier.isAbstract(abstractClassType.getModifiers())) {
128+
if (!(Modifier.isAbstract(abstractClassType.getModifiers())
129+
&& !Modifier.isInterface(abstractClassType.getModifiers()))) {
129130
throw new IllegalArgumentException(
130131
"abstractClassExtends option first parameter should be abstract class. "
131132
+ abstractClassType.getTypeName()

fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/InterfaceTestSpecs.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.util.List;
2222

23+
import lombok.EqualsAndHashCode;
2324
import lombok.Value;
2425

2526
class InterfaceTestSpecs {
@@ -61,4 +62,14 @@ public List<InterfaceObject> getObject() {
6162
public static class InterfaceWrapperObject {
6263
InterfaceObject value;
6364
}
65+
66+
abstract static class AbstractClassObject {
67+
abstract Object getObject();
68+
}
69+
70+
@EqualsAndHashCode(callSuper = true)
71+
@Value
72+
public static class AbstractClassStringChildObject extends AbstractClassObject {
73+
String object;
74+
}
6475
}

fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/JavaTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.time.Instant;
3333
import java.util.Arrays;
3434
import java.util.Collection;
35+
import java.util.Collections;
3536
import java.util.HashSet;
3637
import java.util.List;
3738
import java.util.Map;
@@ -92,6 +93,8 @@
9293
import com.navercorp.fixturemonkey.tests.java.ImmutableRecursiveTypeSpecs.SelfRecursiveListObject;
9394
import com.navercorp.fixturemonkey.tests.java.ImmutableRecursiveTypeSpecs.SelfRecursiveMapObject;
9495
import com.navercorp.fixturemonkey.tests.java.ImmutableRecursiveTypeSpecs.SelfRecursiveObject;
96+
import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.AbstractClassObject;
97+
import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.AbstractClassStringChildObject;
9598
import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.InterfaceIntegerObject;
9699
import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.InterfaceListObject;
97100
import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.InterfaceObject;
@@ -1410,4 +1413,53 @@ void constructorValidator() {
14101413

14111414
then(actual.getValue()).isEqualTo(100);
14121415
}
1416+
1417+
@RepeatedTest(TEST_COUNT)
1418+
void abstractClassExtends() {
1419+
FixtureMonkey sut = FixtureMonkey.builder()
1420+
.plugin(
1421+
new InterfacePlugin()
1422+
.abstractClassExtends(
1423+
AbstractClassObject.class,
1424+
Collections.singletonList(AbstractClassStringChildObject.class))
1425+
)
1426+
.objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
1427+
.build();
1428+
1429+
AbstractClassObject actual = sut.giveMeOne(AbstractClassObject.class);
1430+
1431+
then(actual).isExactlyInstanceOf(AbstractClassStringChildObject.class);
1432+
}
1433+
1434+
@Test
1435+
void abstractExtendsInterfaceThrows() {
1436+
thenThrownBy(
1437+
() -> FixtureMonkey.builder()
1438+
.plugin(
1439+
new InterfacePlugin()
1440+
.abstractClassExtends(
1441+
InterfaceObject.class,
1442+
Collections.singletonList(InterfaceStringObject.class))
1443+
)
1444+
.build()
1445+
)
1446+
.isExactlyInstanceOf(IllegalArgumentException.class)
1447+
.hasMessageContaining("should be abstract class");
1448+
}
1449+
1450+
@Test
1451+
void interfaceImplementsAbstractClassThrows() {
1452+
thenThrownBy(
1453+
() -> FixtureMonkey.builder()
1454+
.plugin(
1455+
new InterfacePlugin()
1456+
.interfaceImplements(
1457+
AbstractClassObject.class,
1458+
Collections.singletonList(AbstractClassStringChildObject.class))
1459+
)
1460+
.build()
1461+
)
1462+
.isExactlyInstanceOf(IllegalArgumentException.class)
1463+
.hasMessageContaining("should be interface");
1464+
}
14131465
}

0 commit comments

Comments
 (0)