涉及文件读取的JUnit测试套件在Windows 10和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中的公共静态函数。

同样在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中的测试将失败,但是如果我在Fedora 23 Linux机器上运行TestSuiteTestSuite通过所有测试。

特别是在Windows上,该程序能够成功地通过try块而不会引发异常,但问题是s.hasNextLine()返回false因此它永远不会读取文件的内容。这与Fedora相反,在Fedora中,s.hasNextLine()返回true并继续能够在全球地图上执行操作。让我感到困惑的是,两个平台上的data.txt相同,那么为什么一个平台的性能与另一个平台不同呢?

有谁知道为什么会发生这种情况,以及我可以做些什么来使我的代码独立于平台?

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

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

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

相关内容

  • 没有找到相关文章

最新更新