Copilot commented on code in PR #3489:
URL: https://github.com/apache/maven-surefire/pull/3489#discussion_r4343514559
##########
surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/LauncherAdapter.java:
##########
@@ -57,15 +66,53 @@ void execute(LauncherDiscoveryRequest discoveryRequest,
TestExecutionListener...
void executeWithoutCancellationToken(
LauncherDiscoveryRequest discoveryRequest,
TestExecutionListener... listeners) {
- delegate.execute(discoveryRequest, listeners);
+ try {
+ delegate.execute(discoveryRequest, listeners);
+ } catch (JUnitException e) {
+ throw withRootCauseMessage(e);
+ }
}
private void executeWithCancellationToken(
LauncherDiscoveryRequest discoveryRequest,
TestExecutionListener... listeners) {
Method executeMethod =
requireNonNull(EXECUTE_METHOD_WITH_LAUNCHER_EXECUTION_REQUEST_PARAMETER);
Object executionRequest = createExecutionRequest(discoveryRequest,
listeners);
- ReflectionUtils.invokeMethodWithArray(delegate, executeMethod,
executionRequest);
+ try {
+ ReflectionUtils.invokeMethodWithArray(delegate, executeMethod,
executionRequest);
+ } catch (JUnitException e) {
+ throw withRootCauseMessage(e);
+ } catch (SurefireReflectionException e) {
+ if (e.getCause() instanceof JUnitException) {
+ throw withRootCauseMessage((JUnitException) e.getCause());
+ }
+ throw e;
+ }
+ }
+
Review Comment:
The reflective execution path only enriches the message when the *immediate*
`SurefireReflectionException` cause is a `JUnitException`. If reflection wraps
the thrown `JUnitException` one level deeper (e.g., `InvocationTargetException`
→ `JUnitException`), this will miss the enrichment and regress the desired
behavior for the cancellation-token path. Consider walking the `Throwable`
cause chain (with cycle protection) to find an embedded `JUnitException` and
enrich that, instead of checking only `e.getCause()`.
##########
surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/TestPlanScannerFilterTest.java:
##########
@@ -237,6 +244,130 @@ public void execute(TestPlan testPlan,
TestExecutionListener... listeners) {
}
}
+ @org.junit.jupiter.api.Test
Review Comment:
The new tests use fully-qualified `@org.junit.jupiter.api.Test` repeatedly
even though the file already uses JUnit Jupiter imports. This is noisy and
inconsistent with typical JUnit usage. Prefer importing
`org.junit.jupiter.api.Test` and using `@Test` for readability/maintainability.
##########
surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/TestPlanScannerFilterTest.java:
##########
@@ -237,6 +244,130 @@ public void execute(TestPlan testPlan,
TestExecutionListener... listeners) {
}
}
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed", new
RuntimeException("wrapper", rootCause)));
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureDoesNotDuplicateRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed:
listener failed during discovery", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: listener failed during
discovery", failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseTypeWhenMessageIsNull() {
+ IllegalStateException rootCause = new IllegalStateException();
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(new JUnitException("engine
discovery failed", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
Review Comment:
The new tests use fully-qualified `@org.junit.jupiter.api.Test` repeatedly
even though the file already uses JUnit Jupiter imports. This is noisy and
inconsistent with typical JUnit usage. Prefer importing
`org.junit.jupiter.api.Test` and using `@Test` for readability/maintainability.
##########
surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/TestPlanScannerFilterTest.java:
##########
@@ -237,6 +244,130 @@ public void execute(TestPlan testPlan,
TestExecutionListener... listeners) {
}
}
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed", new
RuntimeException("wrapper", rootCause)));
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureDoesNotDuplicateRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed:
listener failed during discovery", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: listener failed during
discovery", failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseTypeWhenMessageIsNull() {
+ IllegalStateException rootCause = new IllegalStateException();
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(new JUnitException("engine
discovery failed", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseTypeWhenMessageIsEmpty() {
+ IllegalStateException rootCause = new IllegalStateException("");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(new JUnitException("engine
discovery failed", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureWithoutCauseKeepsOriginalMessage() {
+ JUnitException original = new JUnitException("engine discovery
failed");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(original);
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed", failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void executionFailureIncludesRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
Review Comment:
In the execution-failure test, the root-cause message says \"listener failed
during discovery\", which is misleading in the context of an execution failure.
Rename the message (or the test) so the scenario described by the strings
aligns with the test intent.
##########
surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/TestPlanScannerFilterTest.java:
##########
@@ -237,6 +244,130 @@ public void execute(TestPlan testPlan,
TestExecutionListener... listeners) {
}
}
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed", new
RuntimeException("wrapper", rootCause)));
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureDoesNotDuplicateRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed:
listener failed during discovery", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: listener failed during
discovery", failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseTypeWhenMessageIsNull() {
+ IllegalStateException rootCause = new IllegalStateException();
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(new JUnitException("engine
discovery failed", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseTypeWhenMessageIsEmpty() {
+ IllegalStateException rootCause = new IllegalStateException("");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(new JUnitException("engine
discovery failed", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureWithoutCauseKeepsOriginalMessage() {
+ JUnitException original = new JUnitException("engine discovery
failed");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(original);
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed", failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
Review Comment:
The new tests use fully-qualified `@org.junit.jupiter.api.Test` repeatedly
even though the file already uses JUnit Jupiter imports. This is noisy and
inconsistent with typical JUnit usage. Prefer importing
`org.junit.jupiter.api.Test` and using `@Test` for readability/maintainability.
##########
surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/TestPlanScannerFilterTest.java:
##########
@@ -237,6 +244,130 @@ public void execute(TestPlan testPlan,
TestExecutionListener... listeners) {
}
}
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed", new
RuntimeException("wrapper", rootCause)));
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureDoesNotDuplicateRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed:
listener failed during discovery", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: listener failed during
discovery", failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
Review Comment:
The new tests use fully-qualified `@org.junit.jupiter.api.Test` repeatedly
even though the file already uses JUnit Jupiter imports. This is noisy and
inconsistent with typical JUnit usage. Prefer importing
`org.junit.jupiter.api.Test` and using `@Test` for readability/maintainability.
##########
surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/TestPlanScannerFilterTest.java:
##########
@@ -237,6 +244,130 @@ public void execute(TestPlan testPlan,
TestExecutionListener... listeners) {
}
}
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed", new
RuntimeException("wrapper", rootCause)));
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureDoesNotDuplicateRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed:
listener failed during discovery", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: listener failed during
discovery", failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseTypeWhenMessageIsNull() {
+ IllegalStateException rootCause = new IllegalStateException();
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(new JUnitException("engine
discovery failed", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseTypeWhenMessageIsEmpty() {
+ IllegalStateException rootCause = new IllegalStateException("");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(new JUnitException("engine
discovery failed", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureWithoutCauseKeepsOriginalMessage() {
+ JUnitException original = new JUnitException("engine discovery
failed");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(original);
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed", failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void executionFailureIncludesRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ doThrow(new JUnitException("engine discovery failed", rootCause))
+ .when(launcher)
+ .execute(
+ any(LauncherDiscoveryRequest.class),
+
any(org.junit.platform.launcher.TestExecutionListener[].class));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new LauncherAdapter(launcher, null)
+
.executeWithoutCancellationToken(mock(LauncherDiscoveryRequest.class)));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
Review Comment:
The new tests use fully-qualified `@org.junit.jupiter.api.Test` repeatedly
even though the file already uses JUnit Jupiter imports. This is noisy and
inconsistent with typical JUnit usage. Prefer importing
`org.junit.jupiter.api.Test` and using `@Test` for readability/maintainability.
##########
surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/TestPlanScannerFilterTest.java:
##########
@@ -237,6 +244,130 @@ public void execute(TestPlan testPlan,
TestExecutionListener... listeners) {
}
}
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed", new
RuntimeException("wrapper", rootCause)));
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureDoesNotDuplicateRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed:
listener failed during discovery", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: listener failed during
discovery", failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseTypeWhenMessageIsNull() {
+ IllegalStateException rootCause = new IllegalStateException();
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(new JUnitException("engine
discovery failed", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseTypeWhenMessageIsEmpty() {
+ IllegalStateException rootCause = new IllegalStateException("");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any())).thenThrow(new JUnitException("engine
discovery failed", rootCause));
+
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
Review Comment:
The new tests use fully-qualified `@org.junit.jupiter.api.Test` repeatedly
even though the file already uses JUnit Jupiter imports. This is noisy and
inconsistent with typical JUnit usage. Prefer importing
`org.junit.jupiter.api.Test` and using `@Test` for readability/maintainability.
##########
surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/TestPlanScannerFilterTest.java:
##########
@@ -237,6 +244,130 @@ public void execute(TestPlan testPlan,
TestExecutionListener... listeners) {
}
}
+ @org.junit.jupiter.api.Test
+ public void discoveryFailureIncludesRootCauseMessage() {
+ RuntimeException rootCause = new RuntimeException("listener failed
during discovery");
+ Launcher launcher = mock(Launcher.class);
+ when(launcher.discover(any()))
+ .thenThrow(new JUnitException("engine discovery failed", new
RuntimeException("wrapper", rootCause)));
+ JUnitException failure = assertThrows(
+ JUnitException.class,
+ () -> new TestPlanScannerFilter(
+ new LauncherAdapter(launcher, null),
+ new Filter<?>[0],
+ singletonList(ClassWithTestMethods.class.getName()),
+ emptyList()));
+
+ assertEquals("engine discovery failed: " + rootCause,
failure.getMessage());
+ }
+
+ @org.junit.jupiter.api.Test
Review Comment:
The new tests use fully-qualified `@org.junit.jupiter.api.Test` repeatedly
even though the file already uses JUnit Jupiter imports. This is noisy and
inconsistent with typical JUnit usage. Prefer importing
`org.junit.jupiter.api.Test` and using `@Test` for readability/maintainability.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]