junit 如何单元测试XML文档到字符串的转换方法

cygmwpex  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(134)
public static String convertDocumentToString(Document xmlDocument) {

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer;
        try {
            transformer = tf.newTransformer();
            StringWriter writer = new StringWriter();

            transformer.transform(new DOMSource(xmlDocument), new StreamResult(writer));

            return writer.getBuffer().toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

字符串
我正在尝试单元测试(junit)以下方法,在单元测试中创建文档的最简单/最简单的方法是什么?
有什么建议吗?Mockito在这里不可行
例如,测试

1. @Test
1. public void convertDocumentToString() {
1. Document document = ??
1. 
1. class.convertDocumentToString(document)


我如何构建一个Document变量来传递给方法

ogq8wdun

ogq8wdun1#

您可以使用DocumentBuilder创建简单的XML文档:

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilderFactory;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class MyTest {

    @Test
    public void myTest() throws Exception {
        Document xmlDocument = createDocument();

        String result = new MyTransformer().convertDocumentToString(xmlDocument);

        String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><root><element>value</element></root>";

        assertEquals(expected, result);
    }

    private Document createDocument() throws Exception {

        Document document = DocumentBuilderFactory.newInstance()
                .newDocumentBuilder()
                .newDocument();

        // Create root element
        Element rootElement = document.createElement("root");
        document.appendChild(rootElement);

        // Create child element
        Element childElement = document.createElement("element");
        childElement.appendChild(document.createTextNode("value"));

        rootElement.appendChild(childElement);

        return document;
    }
}

字符串

pdtvr36n

pdtvr36n2#

最简单/最简单的方法是解析一个XML字符串,并验证你得到的是相同的字符串:

@Test
void test() throws Exception {
    var xml = """
            <?xml version="1.0" encoding="UTF-8" standalone="no"?><root/>""";
    
    var doc = DocumentBuilderFactory
            .newDefaultInstance()
            .newDocumentBuilder()
            .parse(new InputSource(new StringReader(xml)));

    assertEquals(xml, convertDocumentToString(doc));
}

字符串
注意,convertDocumentToString有一个隐式静态导入。
测试该方法在异常时返回null是相当困难的,因为即使输入文档为null或空,Transformer也会传递XML序言,并且不可能构造非法的Document结构(可能存在一些极端情况)。
异常返回null实际上隐藏了一个严重的错误条件。java本身的平台/设置有问题。我建议抛出一个自定义的RuntimeException。

相关问题