涉及文件读取的 JUnit 测试套件在 Windows 10 和 Fedora 23 上的表现不同

JUnit test suite involving file reading is performing differently on Windows 10 and Fedora 23

假设我的整个 Eclipse 项目位于名为 project 的目录中,并且在 project 中,有一个常规的非空、格式良好的文件 data.txt,以及一个目录 src。在 src 中,有两个目录:codetest 用于与目录名称完全相同的包。

code中,我有以下文件A.java

package code;

import java.util.*;
import java.io.*;

public class A {
  private static Map<Integer, String> m = makeMap("data.txt");

  private static Map<Integer, String> makeMap(String file) {
    Map<Integer, String> m = new HashMap<Integer, String>();
    try {
      int i = 0;
      Scanner s = new Scanner(new File(file));
      while (s.hasNextLine()) {
        m.put(i, s.nextLine());
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
      System.exit(1);
    }
    return m;
  }

  // a bunch of public static methods that use the global static variable m
}

test 中,我有 ATest.java,它是 A.java 的 JUnit 测试文件。它仅包含几个测试用例,用于测试 A.java.

中的 public 静态函数

同样在test,我还有一个文件TestSuite.java,就是下面的

package test;

import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import org.junit.runner.RunWith;

@RunWith(Suite.class)
@SuiteClasses({ ATest.class })

public final class TestSuite { }

如果我在任何机器上 运行 ATest,它将通过所有测试。如果我在 Windows 10 机器上 运行 TestSuiteATest 中的测试将失败,但如果我在 运行 TestSuite Fedora 23 Linux 机器,TestSuite 通过所有测试。

特别是在 Windows 上,程序能够顺利通过 try 块而没有抛出异常,但问题是 s.hasNextLine() returns false 所以它从不读取文件的内容。这与 Fedora 相反,其中 s.hasNextLine() returns true 并继续执行能够在全局地图上执行的操作。让我感到困惑的是 data.txt 在两个平台上都是一样的,那么为什么一个平台的表现会与另一个不同?

有人知道为什么会这样吗?我可以做些什么来使我的代码独立于平台?

编辑: data.txt 包含日语字符,因此如果有帮助,它会以 UTF-8 编码

您需要指定您正在阅读的文件的编码。如果未指定,它将使用平台默认值,该默认值并不总是 UTF-8

这是使用 Scanner(File, String charset) 构造函数完成的。