diff --git a/src/main/java/org/mockito/internal/junit/JUnitRule.java b/src/main/java/org/mockito/internal/junit/JUnitRule.java index ba00c343ae..3bd3dacfe0 100644 --- a/src/main/java/org/mockito/internal/junit/JUnitRule.java +++ b/src/main/java/org/mockito/internal/junit/JUnitRule.java @@ -7,6 +7,7 @@ import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.Statement; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import org.mockito.MockitoSession; import org.mockito.internal.session.MockitoSessionLoggerAdapter; import org.mockito.plugins.MockitoLogger; @@ -34,12 +35,16 @@ public JUnitRule(MockitoLogger logger, Strictness strictness) { public Statement apply(final Statement base, final FrameworkMethod method, final Object target) { return new Statement() { public void evaluate() throws Throwable { - session = Mockito.mockitoSession() - .name(target.getClass().getSimpleName() + "." + method.getName()) - .strictness(strictness) - .logger(new MockitoSessionLoggerAdapter(logger)) - .initMocks(target) - .startMocking(); + if (session == null) { + session = Mockito.mockitoSession() + .name(target.getClass().getSimpleName() + "." + method.getName()) + .strictness(strictness) + .logger(new MockitoSessionLoggerAdapter(logger)) + .initMocks(target) + .startMocking(); + } else { + MockitoAnnotations.initMocks(target); + } Throwable testFailure = evaluateSafely(base); session.finishMocking(testFailure); if (testFailure != null) { diff --git a/src/test/java/org/mockitousage/junitrule/MockitoJUnitRuleTest.java b/src/test/java/org/mockitousage/junitrule/MockitoJUnitRuleTest.java index dfec883488..3ea7adde3e 100644 --- a/src/test/java/org/mockitousage/junitrule/MockitoJUnitRuleTest.java +++ b/src/test/java/org/mockitousage/junitrule/MockitoJUnitRuleTest.java @@ -19,6 +19,10 @@ public class MockitoJUnitRuleTest { @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); + // Fixes #1578: Protect against multiple execution. + @Rule + public MockitoRule mockitoRule2 = mockitoRule; + @Mock private Injected injected;