涉及文件读取的 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
中,有两个目录:code
和 test
用于与目录名称完全相同的包。
在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 机器上 运行 TestSuite
,ATest
中的测试将失败,但如果我在 运行 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)
构造函数完成的。
假设我的整个 Eclipse 项目位于名为 project
的目录中,并且在 project
中,有一个常规的非空、格式良好的文件 data.txt
,以及一个目录 src
。在 src
中,有两个目录:code
和 test
用于与目录名称完全相同的包。
在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 机器上 运行 TestSuite
,ATest
中的测试将失败,但如果我在 运行 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)
构造函数完成的。