{"record":{"id":"1292b7fafcdc6e1d","repo":"karatelabs/karate","slug":"failed-to-write-junit-xml-for-junitxmlwriter","errorCode":null,"errorMessage":"Failed to write JUnit XML for {}: {}","messagePattern":"Failed to write JUnit XML for (.+?): (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"karate-core/src/main/java/io/karatelabs/output/JunitXmlWriter.java","lineNumber":117,"sourceCode":"            Files.writeString(outputDir.resolve(fileName), content);\n        } catch (Exception e) {\n            logger.warn(\"Failed to write xml for {}: {}\", fileName, e.getMessage());\n        }\n    }\n\n    public static void writeFeature(FeatureResult result, Path outputDir) {\n        try {\n            if (!Files.exists(outputDir)) {\n                Files.createDirectories(outputDir);\n            }\n\n            String fileName = result.getFeature().getResource().getPackageQualifiedName() + \".xml\";\n            Path xmlPath = outputDir.resolve(fileName);\n            String xml = featureToXml(result);\n            Files.writeString(xmlPath, xml);\n            logger.debug(\"JUnit XML written: {}\", xmlPath);\n        } catch (Exception e) {\n            logger.warn(\"Failed to write JUnit XML for {}: {}\", result.getDisplayName(), e.getMessage());\n        }\n    }\n\n    /**\n     * Convert a single feature result to JUnit XML string.\n     *\n     * @param result the feature result\n     * @return XML string\n     */\n    public static String featureToXml(FeatureResult result) {\n        DecimalFormat formatter = (DecimalFormat) NumberFormat.getNumberInstance(Locale.US);\n        formatter.applyPattern(\"0.######\");\n\n        String packageQualifiedName = result.getFeature().getResource().getPackageQualifiedName();\n\n        StringBuilder xml = new StringBuilder();\n\n        // Root testsuite element (single feature)","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/karatelabs/karate/blob/a22eb90246d958d15a47bf436693d0121ad2812d/karate-core/src/main/java/io/karatelabs/output/JunitXmlWriter.java#L99-L135","documentation":"JunitXmlWriter.writeFeature() converts a FeatureResult to XML and writes it as <packageQualifiedName>.xml in the output directory. Any exception in conversion or writing is logged with the feature's display name; the test run continues without that XML report.","triggerScenarios":"Exception from featureToXml(result) or Files.writeString(xmlPath, xml) — unwritable/missing output directory, or a FeatureResult whose content breaks XML generation.","commonSituations":"Legacy callers writing JUnit XML outside the listener flow; outputDir cleaned concurrently; features with names producing colliding or invalid XML file names; serialization bugs on unusual result data.","solutions":["Ensure outputDir exists and is writable before calling writeFeature","Check the derived fileName (packageQualifiedName) for illegal characters or collisions","Enable debug logging ('JUnit XML written' vs the warning) to isolate the failing feature","Inspect the FeatureResult content for data that breaks conversion and upgrade Karate if it is a serializer bug"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if (!Files.isWritable(outputDir))\n    throw new IllegalStateException(\"output dir not writable: \" + outputDir);\nString name = result.getFeature().getResource().getPackageQualifiedName() + \".xml\";\nif (!name.matches(\"[A-Za-z0-9._-]+\")) logger.warn(\"suspicious xml file name: {}\", name);","typeGuard":null,"tryCatchPattern":"try {\n    Files.writeString(outputDir.resolve(fileName), featureToXml(result));\n} catch (Exception e) {\n    logger.warn(\"Failed to write JUnit XML for {}: {}\", result.getDisplayName(), e.getMessage(), e);\n}","preventionTips":["Prefer the listener-driven writeSerialized path; reserve writeFeature for custom pipelines","Validate packageQualifiedName produces unique, legal file names","Upgrade Karate if conversion fails reproducibly on specific result data"],"tags":["junit-xml","filesystem","xml","reporting"],"backgroundTag":"file-write-failed","analyzedSha":"a22eb90246d958d15a47bf436693d0121ad2812d","analyzedAt":"2026-09-12T09:01:00.220Z","contentChangedAt":"2026-09-12T09:01:00.220Z","schemaVersion":2},"datasetVersion":"2026-09-16T19:17:19.609Z"}