diff --git a/junit-tests/src/test/java/org/junit/gen5/engine/junit4/JUnit4TestEngineClassExecutionTests.java b/junit-tests/src/test/java/org/junit/gen5/engine/junit4/JUnit4TestEngineClassExecutionTests.java index ac028afe40b..6756996ae8d 100644 --- a/junit-tests/src/test/java/org/junit/gen5/engine/junit4/JUnit4TestEngineClassExecutionTests.java +++ b/junit-tests/src/test/java/org/junit/gen5/engine/junit4/JUnit4TestEngineClassExecutionTests.java @@ -21,6 +21,7 @@ import org.junit.gen5.engine.ExecutionEventRecordingEngineExecutionListener; import org.junit.gen5.engine.ExecutionRequest; import org.junit.gen5.engine.junit4.samples.PlainJUnit4TestCaseWithSingleTestWhichFails; +import org.junit.gen5.engine.junit4.samples.PlainJUnit4TestCaseWithTwoTests; class JUnit4TestEngineClassExecutionTests { @@ -42,6 +43,24 @@ void executesPlainJUnit4TestCaseWithSingleTestWhichFails() { // @formatter:on } + @Test + void executesPlainJUnit4TestCaseWithTwoTests() { + Class testClass = PlainJUnit4TestCaseWithTwoTests.class; + + execute(testClass); + + // @formatter:off + assertThat(listener.getExecutionEvents()) + .hasSize(6) + .has(allOf(container(testClass.getName()), started()), atIndex(0)) + .has(allOf(test("failingTest"), started()), atIndex(1)) + .has(allOf(test("failingTest"), finishedWithFailure(causeMessage("this test should fail"))), atIndex(2)) + .has(allOf(test("successfulTest"), started()), atIndex(3)) + .has(allOf(test("successfulTest"), finishedSuccessfully()), atIndex(4)) + .has(allOf(container(testClass.getName()), finishedSuccessfully()), atIndex(5)); + // @formatter:on + } + private void execute(Class testClass) { JUnit4TestEngine engine = new JUnit4TestEngine(); EngineAwareTestDescriptor engineTestDescriptor = engine.discoverTests(build(forClass(testClass))); diff --git a/junit-tests/src/test/java/org/junit/gen5/engine/junit4/samples/PlainJUnit4TestCaseWithTwoTests.java b/junit-tests/src/test/java/org/junit/gen5/engine/junit4/samples/PlainJUnit4TestCaseWithTwoTests.java new file mode 100644 index 00000000000..463faaffb81 --- /dev/null +++ b/junit-tests/src/test/java/org/junit/gen5/engine/junit4/samples/PlainJUnit4TestCaseWithTwoTests.java @@ -0,0 +1,32 @@ +/* + * Copyright 2015-2016 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution and is available at + * + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.junit.gen5.engine.junit4.samples; + +import static org.junit.Assert.*; +import static org.junit.runners.MethodSorters.NAME_ASCENDING; + +import org.junit.FixMethodOrder; +import org.junit.Test; + +@FixMethodOrder(NAME_ASCENDING) +public class PlainJUnit4TestCaseWithTwoTests { + + @Test + public void failingTest() { + fail("this test should fail"); + } + + @Test + public void successfulTest() { + assertEquals(3, 1 + 2); + } + +} diff --git a/junit4-engine/src/main/java/org/junit/gen5/engine/junit4/JUnit4TestEngine.java b/junit4-engine/src/main/java/org/junit/gen5/engine/junit4/JUnit4TestEngine.java index 6ebb2250c8b..7783f850839 100644 --- a/junit4-engine/src/main/java/org/junit/gen5/engine/junit4/JUnit4TestEngine.java +++ b/junit4-engine/src/main/java/org/junit/gen5/engine/junit4/JUnit4TestEngine.java @@ -19,8 +19,7 @@ import org.junit.gen5.engine.junit4.descriptor.RunnerTestDescriptor; import org.junit.gen5.engine.junit4.discovery.JUnit4TestPlanSpecificationResolver; import org.junit.gen5.engine.junit4.execution.RunListenerAdapter; -import org.junit.runner.Runner; -import org.junit.runner.notification.RunNotifier; +import org.junit.runner.JUnitCore; public class JUnit4TestEngine implements TestEngine { @@ -50,10 +49,8 @@ public void execute(ExecutionRequest request) { private void executeSingleRunner(RunnerTestDescriptor runnerTestDescriptor, EngineExecutionListener engineExecutionListener) { - RunNotifier notifier = new RunNotifier(); - notifier.addListener(new RunListenerAdapter(runnerTestDescriptor, engineExecutionListener)); - - Runner runner = runnerTestDescriptor.getRunner(); - runner.run(notifier); + JUnitCore core = new JUnitCore(); + core.addListener(new RunListenerAdapter(runnerTestDescriptor, engineExecutionListener)); + core.run(runnerTestDescriptor.getRunner()); } } diff --git a/junit4-engine/src/main/java/org/junit/gen5/engine/junit4/execution/RunListenerAdapter.java b/junit4-engine/src/main/java/org/junit/gen5/engine/junit4/execution/RunListenerAdapter.java index 9e09ab41e29..5a799a85ed1 100644 --- a/junit4-engine/src/main/java/org/junit/gen5/engine/junit4/execution/RunListenerAdapter.java +++ b/junit4-engine/src/main/java/org/junit/gen5/engine/junit4/execution/RunListenerAdapter.java @@ -14,6 +14,7 @@ import static java.util.stream.Collectors.toMap; import static org.junit.gen5.engine.TestExecutionResult.*; +import java.util.LinkedHashMap; import java.util.Map; import org.junit.gen5.engine.EngineExecutionListener; @@ -22,15 +23,20 @@ import org.junit.gen5.engine.junit4.descriptor.JUnit4TestDescriptor; import org.junit.gen5.engine.junit4.descriptor.RunnerTestDescriptor; import org.junit.runner.Description; +import org.junit.runner.Result; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; public class RunListenerAdapter extends RunListener { + private final RunnerTestDescriptor runnerTestDescriptor; private final EngineExecutionListener listener; + private final Map descriptionToDescriptor; + private final Map executionResults = new LinkedHashMap<>(); public RunListenerAdapter(RunnerTestDescriptor runnerTestDescriptor, EngineExecutionListener listener) { + this.runnerTestDescriptor = runnerTestDescriptor; this.listener = listener; // @formatter:off descriptionToDescriptor = runnerTestDescriptor.allDescendants().stream() @@ -40,19 +46,38 @@ public RunListenerAdapter(RunnerTestDescriptor runnerTestDescriptor, EngineExecu // @formatter:on } + @Override + public void testRunStarted(Description description) throws Exception { + fireExecutionStarted(runnerTestDescriptor); + } + @Override public void testStarted(Description description) throws Exception { - TestDescriptor testDescriptor = lookupDescriptor(description); - listener.executionStarted(testDescriptor.getParent().get()); - listener.executionStarted(testDescriptor); + fireExecutionStarted(lookupDescriptor(description)); } @Override public void testFailure(Failure failure) throws Exception { TestDescriptor testDescriptor = lookupDescriptor(failure.getDescription()); - TestExecutionResult result = failed(failure.getException()); - listener.executionFinished(testDescriptor, result); - listener.executionFinished(testDescriptor.getParent().get(), successful()); + executionResults.put(testDescriptor, failed(failure.getException())); + } + + @Override + public void testFinished(Description description) throws Exception { + fireExecutionFinished(lookupDescriptor(description)); + } + + @Override + public void testRunFinished(Result result) throws Exception { + fireExecutionFinished(runnerTestDescriptor); + } + + private void fireExecutionStarted(TestDescriptor testDescriptor) { + listener.executionStarted(testDescriptor); + } + + private void fireExecutionFinished(TestDescriptor testDescriptor) { + listener.executionFinished(testDescriptor, executionResults.getOrDefault(testDescriptor, successful())); } private TestDescriptor lookupDescriptor(Description description) {