测试在本地 Windows 机器上工作但在 Linux 服务器上失败

时间:2021-04-01 17:08:24

标签: java unit-testing exception jar

我有这个测试:

@Test
void testHeader() {
        
    String inputFile = ".\\src\\main\\resources\\binaryFile";
    MDHeader addHeader = new MDHeader();
        
    try (
                InputStream inputStream = new FileInputStream(inputFile);
    ) {
     
        long fileSize = new File(inputFile).length();
        byte[] allBytes = new byte[(int) fileSize];
        inputStream.read(allBytes);
        ProducerRecord<String, byte[]> record = new ProducerRecord<String, byte[]>("foo", allBytes);
        ProducerRecord<String, byte[]> hdr = addHeader.addMDHeader(record);
                
        for (Header header : hdr.headers()) {
            assertEquals("mdpHeader", header.key());
        }
    }
    catch(Exception e) {
        assert (false);
    }
}

在我的 Windows 桌面上通过 Eclipse 在本地运行时测试成功,但尝试在 Linux 服务器上构建 jar 时在 com.me.be.HeaderTests.testMDHeader(HeaderTests.java:81) 处失败。那是行assert (false)。我还没有关于这个问题的更多信息,但想知道它是否可能是 Linux 环境中 inputFile 中的反斜杠?

2 个答案:

答案 0 :(得分:2)

Windows 和 Linux 上的 Java 都接受 / 作为路径分隔符,而 Linux 不喜欢 \\ 作为路径分隔符 - 因此将整个字符串视为一个路径组件,而不是像您一样的 4 个部分期望:

String inputFile = "./src/main/resources/binaryFile";

但是对于文件处理,最好使用 java.nio.Pathjava.io.File 代替 String

WINDOWS
jshell> Path.of("./src/main/resources/binaryFile")
$2 ==> .\src\main\resources\binaryFile

Linux
jshell> Path.of("./src/main/resources/binaryFile")
$1 ==> ./src/main/resources/binaryFile

对于任何操作系统,您也可以使用不带任何文件分隔符的 Path.of

Path p = Path.of("src","main","resources","binaryFile");

答案 1 :(得分:2)

File.separator 字符串可以方便地连接到路径字符串中,以生成独立于操作系统的文件路径。

String inputFile = "." + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "binaryFile";

应该给你一个跨平台兼容的文件路径。