This is an automated email from the ASF dual-hosted git repository.
sjaranowski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git
The following commit(s) were added to refs/heads/master by this push:
new 71fdc2c8c Fix capturing of output of JUnit `LauncherSessionListener`
(#3157)
71fdc2c8c is described below
commit 71fdc2c8c59d3e48369ad27f84557193639440b2
Author: Daniel Clausen <[email protected]>
AuthorDate: Sat Jul 19 18:53:16 2025 +0200
Fix capturing of output of JUnit `LauncherSessionListener` (#3157)
* Adjust outputIsCaptured test for output from launcher session listeners
* Make sure capturing output starts before opening the launcher session
A launcher session listener can also produce output.
We want to capture this. Therefore, we have to start capturing
before opening the launcher session.
* Update
surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
Co-authored-by: Marc Philipp <[email protected]>
---------
Co-authored-by: Marc Philipp <[email protected]>
---
.../junitplatform/JUnitPlatformProvider.java | 8 ++--
.../junitplatform/JUnitPlatformProviderTest.java | 46 ++++++++++++++++++++--
2 files changed, 46 insertions(+), 8 deletions(-)
diff --git
a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
index 70e0cac92..3be6ceffd 100644
---
a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
+++
b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
@@ -107,11 +107,11 @@ public Iterable<Class<?>> getSuites() {
public RunResult invoke(Object forkTestSet) throws TestSetFailedException,
ReporterException {
ReporterFactory reporterFactory = parameters.getReporterFactory();
final RunResult runResult;
- try (LauncherSessionAdapter launcherSession =
launcherSessionFactory.openSession()) {
- RunListenerAdapter adapter = new
RunListenerAdapter(reporterFactory.createTestReportListener());
- adapter.setRunMode(NORMAL_RUN);
+ RunListenerAdapter adapter = new
RunListenerAdapter(reporterFactory.createTestReportListener());
+ adapter.setRunMode(NORMAL_RUN);
+ startCapture(adapter);
- startCapture(adapter);
+ try (LauncherSessionAdapter launcherSession =
launcherSessionFactory.openSession()) {
setupJunitLogger();
Launcher launcher = launcherSession.getLauncher();
if (forkTestSet instanceof TestsToRun) {
diff --git
a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
index bde1c35c5..67ed25fb0 100644
---
a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
+++
b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
@@ -50,6 +50,7 @@
import org.junit.jupiter.api.Nested;
import org.junit.platform.launcher.EngineFilter;
import org.junit.platform.launcher.LauncherSession;
+import org.junit.platform.launcher.LauncherSessionListener;
import org.junit.platform.launcher.TestExecutionListener;
import org.junit.platform.launcher.TestIdentifier;
import org.junit.platform.launcher.TestPlan;
@@ -692,14 +693,24 @@ public void allDiscoveredTestsAreInvokedForNullArgument()
throws Exception {
public void outputIsCaptured() throws Exception {
TestReportListener<TestOutputReportEntry> runListener =
runListenerMock();
- JUnitPlatformProvider provider = new
JUnitPlatformProvider(providerParametersMock(runListener));
+ LauncherSessionFactory launcherSessionFactory =
+ launcherSessionFactoryWithLauncherSessionListener(new
VerboseLauncherSessionListener());
+ JUnitPlatformProvider provider =
+ new JUnitPlatformProvider(providerParametersMock(runListener),
launcherSessionFactory);
invokeProvider(provider, VerboseTestClass.class);
ArgumentCaptor<TestOutputReportEntry> captor =
ArgumentCaptor.forClass(TestOutputReportEntry.class);
- verify(runListener, times(2)).writeTestOutput(captor.capture());
- assertThat(captor.getAllValues().get(0).getLog()).isEqualTo("stdout");
- assertThat(captor.getAllValues().get(1).getLog()).isEqualTo("stderr");
+ verify(runListener, times(6)).writeTestOutput(captor.capture());
+ assertThat(captor.getAllValues())
+ .extracting(TestOutputReportEntry::getLog)
+ .containsExactly(
+ "stdout from launcherSessionOpened",
+ "stderr from launcherSessionOpened",
+ "stdout",
+ "stderr",
+ "stdout from launcherSessionClosed",
+ "stderr from launcherSessionClosed");
}
@Test
@@ -1141,6 +1152,18 @@ private static LauncherSessionFactory
spyingLauncherSessionFactory(
};
}
+ private static LauncherSessionFactory
launcherSessionFactoryWithLauncherSessionListener(
+ LauncherSessionListener launcherSessionListener) {
+ LauncherConfig launcherConfig = LauncherConfig.builder()
+ .addLauncherSessionListeners(launcherSessionListener)
+ .build();
+
+ return () -> {
+ LauncherSession session =
LauncherFactory.openSession(launcherConfig);
+ return new ConcreteLauncherSessionAdapter(session);
+ };
+ }
+
static class TestClass1 {
static final int TESTS_FOUND = 4;
@@ -1207,6 +1230,21 @@ void test() {
}
}
+ static class VerboseLauncherSessionListener implements
LauncherSessionListener {
+
+ @Override
+ public void launcherSessionOpened(LauncherSession session) {
+ System.out.println("stdout from launcherSessionOpened");
+ System.err.println("stderr from launcherSessionOpened");
+ }
+
+ @Override
+ public void launcherSessionClosed(LauncherSession session) {
+ System.out.println("stdout from launcherSessionClosed");
+ System.out.println("stderr from launcherSessionClosed");
+ }
+ }
+
@Test
public void usesClassNamesForXmlReport() throws TestSetFailedException {
String[] classNames = {Sub1Tests.class.getName(),
Sub2Tests.class.getName()};