From eebd15b433801a842a7c71b7bcf13f5bba33ab7e Mon Sep 17 00:00:00 2001 From: Serge Bishyr Date: Mon, 26 Mar 2018 12:38:26 +0300 Subject: [PATCH] Fix #1346 - Different mocks are used for @Mock and @InjectMock in the same test class with JUnit 5 extension --- .../junit/jupiter/MockitoExtension.java | 11 +++++----- .../org/mockitousage/JunitJupiterTest.java | 20 +++++++++++++++++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java b/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java index e8e576bd3d..349217474a 100644 --- a/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java +++ b/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java @@ -5,6 +5,9 @@ package org.mockito.junit.jupiter; +import java.util.LinkedHashSet; +import java.util.Optional; +import java.util.Set; import org.junit.jupiter.api.extension.AfterEachCallback; import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; @@ -15,10 +18,6 @@ import org.mockito.junit.MockitoJUnitRunner; import org.mockito.quality.Strictness; -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; - import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.create; import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation; @@ -101,7 +100,7 @@ public void postProcessTestInstance(Object testInstance, ExtensionContext contex */ @Override public void beforeEach(final ExtensionContext context) { - List testInstances = new LinkedList<>(); + Set testInstances = new LinkedHashSet<>(); testInstances.add(context.getRequiredTestInstance()); this.collectParentTestInstances(context, testInstances); @@ -135,7 +134,7 @@ private Optional retrieveAnnotationFromTestClasses(final Extens return annotation; } - private void collectParentTestInstances(ExtensionContext context, List testInstances) { + private void collectParentTestInstances(ExtensionContext context, Set testInstances) { Optional parent = context.getParent(); while (parent.isPresent() && parent.get() != context.getRoot()) { diff --git a/subprojects/junit-jupiter/src/test/java/org/mockitousage/JunitJupiterTest.java b/subprojects/junit-jupiter/src/test/java/org/mockitousage/JunitJupiterTest.java index 3ce8c9c8f7..47361589a5 100644 --- a/subprojects/junit-jupiter/src/test/java/org/mockitousage/JunitJupiterTest.java +++ b/subprojects/junit-jupiter/src/test/java/org/mockitousage/JunitJupiterTest.java @@ -4,15 +4,15 @@ */ package org.mockitousage; +import java.util.function.Function; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.function.Function; - import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(MockitoExtension.class) @@ -21,6 +21,9 @@ class JunitJupiterTest { @Mock private Function rootMock; + @InjectMocks + private ClassWithDependency classWithDependency; + @Test void ensureMockCreationWorks() { assertThat(rootMock).isNotNull(); @@ -70,4 +73,17 @@ void shouldWeCreateMocksInTheParentContext() { assertThat(rootMock).isNotNull(); } } + + @Test + void should_be_injected_correct_instance_of_mock() { + assertThat(classWithDependency.dependency).isSameAs(rootMock); + } + + private static class ClassWithDependency { + private final Function dependency; + + private ClassWithDependency(Function dependency) { + this.dependency = dependency; + } + } }