我有以下方法可以检查两个XML文档是否匹配:
@Test
public void currentXMLShouldMatchXMLSpecification() throws Exception {
String xml1 = convertXMLToString("/module/docs/document1.xml");
String xml2 = convertXMLToString("/module/docs/document2.xml");
XMLUnit.setIgnoreWhitespace(true); // ignore whitespace differences
assertXMLEquals(xml1, xml2);
}
将XML转换为String方法:
public static String convertXMLToString(String filePath) throws IOException {
//filename is filepath string
BufferedReader br = new BufferedReader(new FileReader(new File(filePath)));
String line;
StringBuilder sb = new StringBuilder();
while((line=br.readLine())!= null){
sb.append(line.trim());
}
return line;
}
断言XML等于方法:
public static void assertXMLEquals(String expectedXML, String actualXML) throws Exception {
XMLUnit.setIgnoreWhitespace(true);
XMLUnit.setIgnoreAttributeOrder(true);
DetailedDiff diff = new DetailedDiff(XMLUnit.compareXML(expectedXML, actualXML));
List<?> allDifferences = diff.getAllDifferences();
Assert.assertEquals("Differences found: " + diff.toString(), 0, allDifferences.size());
}
错误:
java.io.FileNotFoundException:(The system cannot find the path specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at java.io.FileReader.<init>(FileReader.java:72)
我是否需要将XML文档移动到Resources文件夹下?或者这是我犯的代码错误?
请注意,包含此测试的测试类与我尝试阅读的文档不在同一模块中。
答案 0 :(得分:1)
对于像这样的java单元测试,我对测试文件的建议是:
src/test/resources
下,然后位于文件夹中以匹配测试类的包。IOUtils.toString(InputStream)
中的commons-io
来读取文件。Class.getResourcesAsStream(String)
引用文件本身。因此对于com.my.package.MyTest
,我会将XML文件保存为src/test/resources/com/my/package/test_document1.xml
,代码可能如下所示:
try(InputStream in = MyTest.class.getResourceAsStream("test_document1.xml")) {
return IOUtils.toString(in);
}
答案 1 :(得分:0)
是的,您应该将任何非java文件移动到resources文件夹。如果您将它们放在module/docs/
文件夹下,那么您还应该将代码更改为:
String xml1 = convertXMLToString("module/docs/document1.xml");
String xml2 = convertXMLToString("module/docs/document2.xml");
resources
文件夹下的所有文件都会自动复制到类路径根文件夹中,因此module/
文件夹将相对于类路径的根目录。
修改强>
当您进行测试时,您的测试文件夹有自己的resources
文件夹,因此应该可以访问这些文件。如果要在那里动态复制文件,则可以通过以下方式之一进行:
将文件复制到测试的@Before
方法中的测试输出文件夹中。在测试中使用@Before
注释的方法在单元测试类中的任何测试之前运行。
使用您的构建脚本(maven,gradle等)在测试之前添加额外的步骤以执行此操作
我建议使用第二种方法,因为它更强大且可配置。