Tuesday 13 December 2011

Write JUnit test for XSLT

Firstly, you just create a Util Class for xslt transformer:
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.InputStream;
import java.io.StringWriter;

public class XsltTransformer {
    public static String transformer(InputStream xml, InputStream xslt) throws TransformerException {
        Source xmlSource = new StreamSource(xml);
        StringWriter stringWriter = new StringWriter();
        Result result = new StreamResult(stringWriter);

        TransformerFactory transFact = TransformerFactory.newInstance();
        Source xsltSource = new StreamSource(xslt);
        Transformer trans = transFact.newTransformer(xsltSource);
        trans.setOutputProperty(OutputKeys.INDENT, "yes");
        trans.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");

        trans.transform(xmlSource, result);
        return stringWriter.getBuffer().toString();
    }
}

Secondly, combined with XMLUnit, Junit to verify
@Test
    public void testXSLT() {
        InputStream expectedOutput = ODSEventXsltTest.class.getResourceAsStream("ods-output.xml");
        InputStream xml = ODSEventXsltTest.class.getResourceAsStream("ods.xml");
        InputStream xslt = ODSEventXsltTest.class.getResourceAsStream("SSNOdsExportToCannonical.xsl");

        try {
            String actual = XsltTransformer.transformer(xml, xslt);
            String expected = IOUtils.toString(expectedOutput);
            XMLUnit.setIgnoreWhitespace(true);
            Diff diff = XMLUnit.compareXML(expected, actual);
            String errorMessage = "\nexpected:\n" + expected + "\n-------------------------------------\nbut actual: \n" + actual + "\n>>>>" + diff.toString();
            assertTrue(errorMessage, diff.similar());
        } catch (TransformerException e) {
            fail(e.getLocalizedMessage());
        } catch (SAXException e) {
            fail(e.getLocalizedMessage());
        } catch (IOException e) {
            fail(e.getLocalizedMessage());
        }
    }

No comments:

Post a Comment