JUnit测试中无法写入JSON文件的问题排查
JUnit测试中函数无法写入JSON文件的问题排查
问题背景
编写了一个读取YAML输入、输出JSON结果的函数,该函数在正常运行时能正常写入文件,但在JUnit测试中调用时无法生成目标文件,执行读取文件的代码时抛出文件找不到异常。
相关代码
待测试函数代码
public void computeFunction(Object input, String pathToOutput) { doSomething(input); String outputFile = pathToOutput + "/x1.json"; ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(new File(outputFile), x1); }
JUnit测试代码
@Rule public TemporaryFolder folder = new TemporaryFolder(); @Test public void testFunction() throws Exception { File pathToOutput = folder.newFolder("results"); String x1 = "input"; Object input = new Object(x1); computeFunction(input, pathToOutput.getAbsolutePath()); ObjectMapper mapper = new ObjectMapper(); List<Object> output = mapper.readValue(new File(pathToOutput + "x1.json"), new TypeReference<List<Object>>(){}); assertEquals(val1, output.getValOne()); assertEquals(val2, output.getValTwo()); }
抛出的异常
java.io.FileNotFoundException: /tmp/junitxxxxx/results/x1.json
问题原因
- 测试代码路径拼接错误:测试中读取文件时,直接将
File对象pathToOutput与字符串"x1.json"拼接,会导致最终路径变成/tmp/junitxxxxx/resultsx1.json(缺少目录与文件名之间的斜杠),而函数实际写入的路径是/tmp/junitxxxxx/results/x1.json,因此测试代码找不到正确的文件。 - (注:函数代码中
x1变量未明确展示赋值逻辑,若实际代码中该变量未被doSomething(input)正确赋值,也可能导致写入失败,但根据你描述测试外运行正常,推测是示例代码笔误)
修复方案
修改测试代码中读取文件的路径拼接方式,推荐使用File构造函数自动处理路径分隔符,或正确拼接绝对路径:
修复后的测试代码片段
@Test public void testFunction() throws Exception { File pathToOutput = folder.newFolder("results"); String x1 = "input"; Object input = new Object(x1); computeFunction(input, pathToOutput.getAbsolutePath()); ObjectMapper mapper = new ObjectMapper(); // 方式1:使用File构造函数,自动适配系统路径分隔符 File outputFile = new File(pathToOutput, "x1.json"); // 方式2:手动拼接绝对路径时添加斜杠 // File outputFile = new File(pathToOutput.getAbsolutePath() + "/x1.json"); List<Object> output = mapper.readValue(outputFile, new TypeReference<List<Object>>(){}); assertEquals(val1, output.getValOne()); assertEquals(val2, output.getValTwo()); }
同时需确保computeFunction中的x1变量已被doSomething(input)正确赋值,否则即使路径正确,也会因无有效数据导致写入异常。
内容的提问来源于stack exchange,提问作者amagro
相关产品推荐
相关产品推荐

