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]

Reply via email to