diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/property/ConstructorParameterPropertyGenerator.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/property/ConstructorParameterPropertyGenerator.java index 3c02a6d28..901f7b20b 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/property/ConstructorParameterPropertyGenerator.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/property/ConstructorParameterPropertyGenerator.java @@ -122,11 +122,29 @@ public List generateParameterProperties(ConstructorPropertyGeneratorCo resolveParameterTypes(typeReferencesByConstructor, context.getInputParameterTypes()); Map fieldsByName = TypeCache.getFieldsByName(type); - int parameterSize = resolvedParameterNames.size(); + boolean anyReceiverParameter = Arrays.stream(constructor.getAnnotatedParameterTypes()) + .anyMatch(it -> constructor.getAnnotatedReceiverType() != null + && it.getType().equals(constructor.getAnnotatedReceiverType().getType())); + int parameterSize = typeReferencesByConstructor.size(); Map constructorPropertiesByName = new LinkedHashMap<>(); - for (int i = 0; i < parameterSize; i++) { - String parameterName = resolvedParameterNames.get(i); + if (anyReceiverParameter) { + Parameter receiverParameter = constructor.getParameters()[0]; + constructorPropertiesByName.put( + receiverParameter.getName(), + new ConstructorProperty( + receiverParameter.getAnnotatedType(), + constructor, + receiverParameter.getName(), + null, + null + ) + ); + } + int parameterStartIndex = anyReceiverParameter ? 1 : 0; + for (int i = parameterStartIndex; i < parameterSize; i++) { + int parameterNameIndex = anyReceiverParameter ? i - 1 : i; + String parameterName = resolvedParameterNames.get(parameterNameIndex); Field field = fieldsByName.get(parameterName); Property fieldProperty = field != null ? new FieldProperty( diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/type/TypeCache.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/type/TypeCache.java index a44056b3d..ff25c08b1 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/type/TypeCache.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/type/TypeCache.java @@ -189,9 +189,24 @@ private static String[] getParameterNames(Constructor constructor) { .map(Parameter::getName) .toArray(String[]::new); } else { - ConstructorProperties constructorPropertiesAnnotation = - constructor.getAnnotation(ConstructorProperties.class); - return constructorPropertiesAnnotation.value(); + boolean anyReceiverParameter = Arrays.stream(constructor.getAnnotatedParameterTypes()) + .anyMatch(it -> constructor.getAnnotatedReceiverType() != null + && it.getType().equals(constructor.getAnnotatedReceiverType().getType())); + + String[] constructorPropertiesNames = constructor.getAnnotation(ConstructorProperties.class).value(); + if (!anyReceiverParameter) { + return constructorPropertiesNames; + } + + String receiverParameterName = constructor.getParameters()[0].getName(); + return concatArray(receiverParameterName, constructorPropertiesNames); } } + + private static String[] concatArray(String single, String[] array) { + String[] concat = new String[1 + array.length]; + concat[0] = single; + System.arraycopy(array, 0, concat, 1, array.length); + return concat; + } } 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 779c6b832..714a2a71f 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 @@ -79,6 +79,7 @@ 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.NestedClassTestSpecs.Inner; @SuppressWarnings("rawtypes") class JavaTest { @@ -1092,4 +1093,11 @@ void instantiateConstructorJavaBeansPropertyFilter() { then(actual.getString()).isNull(); then(actual.getWrapperBoolean()).isNotNull(); } + + @RepeatedTest(TEST_COUNT) + void nestedObject(){ + Inner actual = SUT.giveMeOne(Inner.class); + + then(actual).isNotNull(); + } } diff --git a/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/NestedClassTestSpecs.java b/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/NestedClassTestSpecs.java new file mode 100644 index 000000000..aba72ae85 --- /dev/null +++ b/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/NestedClassTestSpecs.java @@ -0,0 +1,11 @@ +package com.navercorp.fixturemonkey.tests.java; + +import lombok.Value; + +class NestedClassTestSpecs { + @SuppressWarnings("InnerClassMayBeStatic") + @Value + public class Inner { + String value; + } +}