从相对路径读取XML - java.io.FileNotFoundException :(系统找不到指定的路径)

时间:2018-01-15 11:16:09

标签: java xml string file bufferedreader

我有以下方法可以检查两个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文件夹下?或者这是我犯的代码错误?

请注意,包含此测试的测试类与我尝试阅读的文档不在同一模块中。

2 个答案:

答案 0 :(得分:1)

对于像这样的java单元测试,我对测试文件的建议是:

  1. 测试资源位于src/test/resources下,然后位于文件夹中以匹配测试类的包。
  2. 使用IOUtils.toString(InputStream)中的commons-io来读取文件。
  3. 使用Class.getResourcesAsStream(String)引用文件本身。
  4. 因此对于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文件夹,因此应该可以访问这些文件。如果要在那里动态复制文件,则可以通过以下方式之一进行:

  1. 将文件复制到测试的@Before方法中的测试输出文件夹中。在测试中使用@Before注释的方法在单元测试类中的任何测试之前运行。

  2. 使用您的构建脚本(maven,gradle等)在测试之前添加额外的步骤以执行此操作

  3. 我建议使用第二种方法,因为它更强大且可配置。