【问题标题】:Reading XML from relative path - java.io.FileNotFoundException:(The system cannot find the path specified)从相对路径读取 XML - java.io.FileNotFoundException:(系统找不到指定的路径)
【发布时间】:2018-06-24 00:25:45
【问题描述】:

我有以下方法可以检查两个 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转字符串方法:

   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 文件夹下?或者这是我正在犯的代码错误?

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

【问题讨论】:

  • 请放堆栈跟踪

标签: java xml string file bufferedreader


【解决方案1】:

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

  1. 测试资源放在src/test/resources下,然后在一个文件夹中匹配测试类的包。
  2. 使用commons-io中的IOUtils.toString(InputStream)读入文件。
  3. 使用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);
}

【讨论】:

    【解决方案2】:

    是的,您应该将所有非 java 文件移动到资源文件夹。如果你把它们放在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 等)添加一个额外的步骤,以便在您的测试执行此操作之前运行

    我建议使用第二种方法,因为它更健壮且可配置。

    【讨论】:

    • 有没有办法可以在运行测试时将文件动态复制到我的资源文件夹中,我问现在我需要将实际文件保存在同一位置,即不在资源中文件夹?
    • 目前,您的 xml 文件的完整路径是什么?
    • @java123999 我根据您的评论更新了我的答案
    • 你能举一个@before方法的例子吗?
    • 在你的测试类中添加这样的方法@Before public void setup() throws Exception { // copy files from source to destination }
    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 2014-12-19
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2012-05-28
    • 2017-11-21
    相关资源
    最近更新 更多