Skip to content

Commit

Permalink
#40: Container events for un-nested Runners
Browse files Browse the repository at this point in the history
------------------------------------------------------------------------
On behalf of the community, the JUnit Lambda Team thanks
msg systems ag (http://www.msg-systems.com) for supporting
the JUnit crowdfunding campaign!
------------------------------------------------------------------------
  • Loading branch information
marcphilipp committed Jan 4, 2016
1 parent 4983a62 commit 19153fa
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 13 deletions.
Expand Up @@ -21,6 +21,7 @@
import org.junit.gen5.engine.ExecutionEventRecordingEngineExecutionListener; import org.junit.gen5.engine.ExecutionEventRecordingEngineExecutionListener;
import org.junit.gen5.engine.ExecutionRequest; import org.junit.gen5.engine.ExecutionRequest;
import org.junit.gen5.engine.junit4.samples.PlainJUnit4TestCaseWithSingleTestWhichFails; import org.junit.gen5.engine.junit4.samples.PlainJUnit4TestCaseWithSingleTestWhichFails;
import org.junit.gen5.engine.junit4.samples.PlainJUnit4TestCaseWithTwoTests;


class JUnit4TestEngineClassExecutionTests { class JUnit4TestEngineClassExecutionTests {


Expand All @@ -42,6 +43,24 @@ void executesPlainJUnit4TestCaseWithSingleTestWhichFails() {
// @formatter:on // @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) { private void execute(Class<?> testClass) {
JUnit4TestEngine engine = new JUnit4TestEngine(); JUnit4TestEngine engine = new JUnit4TestEngine();
EngineAwareTestDescriptor engineTestDescriptor = engine.discoverTests(build(forClass(testClass))); EngineAwareTestDescriptor engineTestDescriptor = engine.discoverTests(build(forClass(testClass)));
Expand Down
@@ -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);
}

}
Expand Up @@ -19,8 +19,7 @@
import org.junit.gen5.engine.junit4.descriptor.RunnerTestDescriptor; import org.junit.gen5.engine.junit4.descriptor.RunnerTestDescriptor;
import org.junit.gen5.engine.junit4.discovery.JUnit4TestPlanSpecificationResolver; import org.junit.gen5.engine.junit4.discovery.JUnit4TestPlanSpecificationResolver;
import org.junit.gen5.engine.junit4.execution.RunListenerAdapter; import org.junit.gen5.engine.junit4.execution.RunListenerAdapter;
import org.junit.runner.Runner; import org.junit.runner.JUnitCore;
import org.junit.runner.notification.RunNotifier;


public class JUnit4TestEngine implements TestEngine { public class JUnit4TestEngine implements TestEngine {


Expand Down Expand Up @@ -50,10 +49,8 @@ public void execute(ExecutionRequest request) {


private void executeSingleRunner(RunnerTestDescriptor runnerTestDescriptor, private void executeSingleRunner(RunnerTestDescriptor runnerTestDescriptor,
EngineExecutionListener engineExecutionListener) { EngineExecutionListener engineExecutionListener) {
RunNotifier notifier = new RunNotifier(); JUnitCore core = new JUnitCore();
notifier.addListener(new RunListenerAdapter(runnerTestDescriptor, engineExecutionListener)); core.addListener(new RunListenerAdapter(runnerTestDescriptor, engineExecutionListener));

core.run(runnerTestDescriptor.getRunner());
Runner runner = runnerTestDescriptor.getRunner();
runner.run(notifier);
} }
} }
Expand Up @@ -14,6 +14,7 @@
import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toMap;
import static org.junit.gen5.engine.TestExecutionResult.*; import static org.junit.gen5.engine.TestExecutionResult.*;


import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;


import org.junit.gen5.engine.EngineExecutionListener; import org.junit.gen5.engine.EngineExecutionListener;
Expand All @@ -22,15 +23,20 @@
import org.junit.gen5.engine.junit4.descriptor.JUnit4TestDescriptor; import org.junit.gen5.engine.junit4.descriptor.JUnit4TestDescriptor;
import org.junit.gen5.engine.junit4.descriptor.RunnerTestDescriptor; import org.junit.gen5.engine.junit4.descriptor.RunnerTestDescriptor;
import org.junit.runner.Description; import org.junit.runner.Description;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure; import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener; import org.junit.runner.notification.RunListener;


public class RunListenerAdapter extends RunListener { public class RunListenerAdapter extends RunListener {


private final RunnerTestDescriptor runnerTestDescriptor;
private final EngineExecutionListener listener; private final EngineExecutionListener listener;

private final Map<Description, JUnit4TestDescriptor> descriptionToDescriptor; private final Map<Description, JUnit4TestDescriptor> descriptionToDescriptor;
private final Map<TestDescriptor, TestExecutionResult> executionResults = new LinkedHashMap<>();


public RunListenerAdapter(RunnerTestDescriptor runnerTestDescriptor, EngineExecutionListener listener) { public RunListenerAdapter(RunnerTestDescriptor runnerTestDescriptor, EngineExecutionListener listener) {
this.runnerTestDescriptor = runnerTestDescriptor;
this.listener = listener; this.listener = listener;
// @formatter:off // @formatter:off
descriptionToDescriptor = runnerTestDescriptor.allDescendants().stream() descriptionToDescriptor = runnerTestDescriptor.allDescendants().stream()
Expand All @@ -40,19 +46,38 @@ public RunListenerAdapter(RunnerTestDescriptor runnerTestDescriptor, EngineExecu
// @formatter:on // @formatter:on
} }


@Override
public void testRunStarted(Description description) throws Exception {
fireExecutionStarted(runnerTestDescriptor);
}

@Override @Override
public void testStarted(Description description) throws Exception { public void testStarted(Description description) throws Exception {
TestDescriptor testDescriptor = lookupDescriptor(description); fireExecutionStarted(lookupDescriptor(description));
listener.executionStarted(testDescriptor.getParent().get());
listener.executionStarted(testDescriptor);
} }


@Override @Override
public void testFailure(Failure failure) throws Exception { public void testFailure(Failure failure) throws Exception {
TestDescriptor testDescriptor = lookupDescriptor(failure.getDescription()); TestDescriptor testDescriptor = lookupDescriptor(failure.getDescription());
TestExecutionResult result = failed(failure.getException()); executionResults.put(testDescriptor, failed(failure.getException()));
listener.executionFinished(testDescriptor, result); }
listener.executionFinished(testDescriptor.getParent().get(), successful());
@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) { private TestDescriptor lookupDescriptor(Description description) {
Expand Down

0 comments on commit 19153fa

Please sign in to comment.