diff --git a/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestSuiteXmlRenderer.java b/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestSuiteXmlRenderer.java index cd1d5276..e6b16ec0 100644 --- a/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestSuiteXmlRenderer.java +++ b/java/src/com/github/bazel_contrib/contrib_rules_jvm/junit5/TestSuiteXmlRenderer.java @@ -10,9 +10,13 @@ import java.time.Instant; import java.time.format.DateTimeFormatter; import java.util.Collection; +import java.util.HashSet; import java.util.Locale; +import java.util.Set; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; +import org.junit.platform.engine.UniqueId; +import org.junit.platform.launcher.TestIdentifier; import org.junit.platform.launcher.TestPlan; class TestSuiteXmlRenderer { @@ -73,8 +77,17 @@ public void toXml(XMLStreamWriter xml, TestData suite, Collection test xml.writeAttribute("package", ""); xml.writeEmptyElement("properties"); + // JUnitParams generates report names based on parameter values rather than parameter types, + // which can result in duplicate test names in the XML output. This situation arises when + // two test methods have identical names but differ in parameter types; however, their + // string representations may be the same (e.g., Integer 1 and Long 1). + Set reportedTests = new HashSet<>(); for (TestData testCase : tests) { - testRenderer.toXml(xml, testCase); + // apply duplicate check only for vintage test + if (!isVintageTest(testCase.getId()) + || reportedTests.add(testCase.getId().getLegacyReportingName())) { + testRenderer.toXml(xml, testCase); + } } writeTextElement(xml, "system-out", suite.getStdOut()); @@ -90,4 +103,12 @@ private String getHostname() { return "localhost"; } } + + private boolean isVintageTest(TestIdentifier testIdentifier) { + return testIdentifier + .getParentIdObject() + .flatMap(UniqueId::getEngineId) + .filter("junit-vintage"::equals) + .isPresent(); + } }