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

标签 java eclipse junit windows-10 fedora-23

假设我的整个 Eclipse 项目位于一个名为 project 的目录中,并且在 project 中,有一个常规的非空、格式良好的文件 data.txt。 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 中的测试将会失败,但如果我在 Fedora 23 上运行 TestSuite Linux 机器,TestSuite 通过了所有测试。

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

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

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

最佳答案

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

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

关于java - 涉及文件读取的 JUnit 测试套件在 Windows 10 和 Fedora 23 上的表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35387533/

相关文章:

java - Spring MVC 和 JUnit : Failed to load ApplicationContext

django - Jenkins JUnit 插件给出错误 "ERROR: No test report files were found. Configuration error?"

java - 卢塞恩 : how to sort by document count in group while doing grouping search

java - 在 IntelliJ 中自定义默认 getter/setter 模板

java - 事件驱动的 future <V> - 线程池

visual-studio - Eclipse 的即时窗口

java - 如何使用 Mockito 解决 ClassCastException?

java - 线程中出现异常 "main"java.lang.NullPointerException InputStreamReader

java - 在 Eclipse 中导出 Runnable JAR 时如何控制文件夹结构?

c++ - Eclipse 在子目录中找不到包含文件