简体   繁体   中英

Test works on local Windows machine but fails on Linux server

I have this test:

@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);
    }
}

The test succeeds when run locally through Eclipse on my Windows desktop but it fails at com.me.be.HeaderTests.testMDHeader(HeaderTests.java:81) when trying to build the jar on a Linux server. That's the line assert (false) . I haven't got any more information on the issue yet but was wondering if it could be the backslashes in inputFile in a Linux environment?

Java on Windows and Linux will both accept / as path separator, whereas Linux does not like \\ as a path separator - so treats the whole string as ONE path component, not 4 parts as you'd expect:

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

However for file handling it is better to use java.nio.Path or java.io.File in place of 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

You can also use Path.of without any file separator for any OS:

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

The File.separator string is handy to concat into the path string in order to produce an OS independent file path.

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

Should give you a cross platform compliant file path.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM