From 2ecee60647525a28f67df6beb843912ea246e5ce Mon Sep 17 00:00:00 2001 From: Tomas Poledny Date: Mon, 16 Nov 2020 09:30:26 +0100 Subject: [PATCH] Fix fullyInitialized with interfaces in constructor --- main/src/mockit/internal/injection/TestedObject.java | 2 +- .../mockit/internal/injection/TestedObjectCreation.java | 4 ++-- .../injection/constructor/ConstructorInjection.java | 4 ++-- .../mockit/internal/injection/full/FullInjection.java | 2 +- main/test/mockit/TestedClassWithFullDITest.java | 9 +++++++++ 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/main/src/mockit/internal/injection/TestedObject.java b/main/src/mockit/internal/injection/TestedObject.java index 6c6fd85ac..f9d5281a3 100644 --- a/main/src/mockit/internal/injection/TestedObject.java +++ b/main/src/mockit/internal/injection/TestedObject.java @@ -125,7 +125,7 @@ private Object createAndRegisterNewObject(@Nonnull Object testClassInstance, @No Object testedInstance = null; if (testedObjectCreation != null) { - testedInstance = testedObjectCreation.create(false); + testedInstance = testedObjectCreation.create(false, true); if (testedInstance != null) { setInstance(testClassInstance, testedInstance); diff --git a/main/src/mockit/internal/injection/TestedObjectCreation.java b/main/src/mockit/internal/injection/TestedObjectCreation.java index 36e56cc7f..e9cc89af9 100644 --- a/main/src/mockit/internal/injection/TestedObjectCreation.java +++ b/main/src/mockit/internal/injection/TestedObjectCreation.java @@ -53,7 +53,7 @@ public TestedObjectCreation( } @Nullable - public Object create(boolean required) { + public Object create(boolean required, boolean needToConstruct) { ConstructorSearch constructorSearch = new ConstructorSearch(injectionState, testedClass, fullInjection != null); Constructor constructor = constructorSearch.findConstructorToUse(); @@ -64,6 +64,6 @@ public Object create(boolean required) { } ConstructorInjection constructorInjection = new ConstructorInjection(injectionState, fullInjection, constructor); - return constructorInjection.instantiate(constructorSearch.parameterProviders, testedClass, required); + return constructorInjection.instantiate(constructorSearch.parameterProviders, testedClass, required, needToConstruct); } } diff --git a/main/src/mockit/internal/injection/constructor/ConstructorInjection.java b/main/src/mockit/internal/injection/constructor/ConstructorInjection.java index 6afebf1fe..e7e9eb5aa 100644 --- a/main/src/mockit/internal/injection/constructor/ConstructorInjection.java +++ b/main/src/mockit/internal/injection/constructor/ConstructorInjection.java @@ -31,7 +31,7 @@ public ConstructorInjection( } @Nullable - public Object instantiate(@Nonnull List parameterProviders, @Nonnull TestedClass testedClass, boolean required) { + public Object instantiate(@Nonnull List parameterProviders, @Nonnull TestedClass testedClass, boolean required, boolean needToConstruct) { Type[] parameterTypes = constructor.getGenericParameterTypes(); int n = parameterTypes.length; List consumedInjectables = n == 0 ? null : injectionState.injectionProviders.saveConsumedInjectionProviders(); @@ -49,7 +49,7 @@ public Object instantiate(@Nonnull List parameterProviders, @ if (parameterProvider instanceof ConstructorParameter) { value = createOrReuseArgumentValue((ConstructorParameter) parameterProvider, required); - if (value == null) { + if (value == null && !needToConstruct) { return null; } } diff --git a/main/src/mockit/internal/injection/full/FullInjection.java b/main/src/mockit/internal/injection/full/FullInjection.java index bc5f73ead..1960db952 100644 --- a/main/src/mockit/internal/injection/full/FullInjection.java +++ b/main/src/mockit/internal/injection/full/FullInjection.java @@ -252,7 +252,7 @@ private Object createNewInstance(@Nonnull Class classToInstantiate, boolean r return newInstanceUsingDefaultConstructorIfAvailable(classToInstantiate); } - return new TestedObjectCreation(injectionState, this, classToInstantiate).create(required); + return new TestedObjectCreation(injectionState, this, classToInstantiate).create(required, false); } @Nonnull diff --git a/main/test/mockit/TestedClassWithFullDITest.java b/main/test/mockit/TestedClassWithFullDITest.java index d3ec79e13..3c56ee45a 100644 --- a/main/test/mockit/TestedClassWithFullDITest.java +++ b/main/test/mockit/TestedClassWithFullDITest.java @@ -145,4 +145,13 @@ public void instantiateClassWithFieldToInjectWhoseTypeCannotBeInstantiated(@Test assertNotNull(cut); assertNull(cut.dependency); } + + static interface InterfaceDependency { } + static class ClassWithInterfaceInConstructor { ClassWithInterfaceInConstructor(@SuppressWarnings("unused") InterfaceDependency someValue) {} } + + @Test + public void instantiateClassWithInterfaceInConstructor(@Tested(fullyInitialized = true) ClassWithInterfaceInConstructor cut) { + assertNotNull(cut); + } + } \ No newline at end of file