From 2ecee60647525a28f67df6beb843912ea246e5ce Mon Sep 17 00:00:00 2001
From: Tomas Poledny <saljacky@gmail.com>
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<InjectionProvider> parameterProviders, @Nonnull TestedClass testedClass, boolean required) {
+   public Object instantiate(@Nonnull List<InjectionProvider> parameterProviders, @Nonnull TestedClass testedClass, boolean required, boolean needToConstruct) {
       Type[] parameterTypes = constructor.getGenericParameterTypes();
       int n = parameterTypes.length;
       List<InjectionProvider> consumedInjectables = n == 0 ? null : injectionState.injectionProviders.saveConsumedInjectionProviders();
@@ -49,7 +49,7 @@ public Object instantiate(@Nonnull List<InjectionProvider> 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