CRC32 校验和在运行时和 JUnit 测试期间不同

CRC32 checksum different during runtime and JUnit test

我目前有一个奇怪的问题。我使用以下函数读取一个文件,从中创建一个对象并将文件内容作为字节数组存储在对象中。

public static Iodd readFile(File file) throws IOException {
    if (!file.getName().endsWith(".xml"))
        throw new InvalidObjectException("Not a valid IODD XML file");

    String s = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
    Iodd i = new XmlMapper().readValue(s, Iodd.class);

    i.setFile(Files.readAllBytes(file.toPath()));

    return i;
}

文件中有 CRC32 校验和。在程序运行期间,我可以使用 java.util.zip.CRC32 class 毫无问题地重现校验和。但是,如果我现在想使用 JUnit 测试以相同的方式进行测试,我会得到一个完全不同的校验和。

您可以找到的测试文件here。请使用不带国家代码的 XML 文件。

我是不是漏掉了什么?

我已经检查了字节数组在 JUnit 测试和运行时是否不同,但一切都匹配。出于测试目的,我根据文件内容创建了一个 MD5 校验和,并使用 JUnit 测试中的 MD5 对其进行了检查,但它们是相等的。

兴趣函数

这是计算CRC32校验和的函数。 removeStamp 方法从 stamp 标签中删除 crc 值。

public static boolean isValidInternal(final byte[] data, final long checkCrc) {
    CRC32 c = new CRC32();
    c.update(removeStamp(data));

    return (c.getValue() == checkCrc);
}

更新 1

我新加了一个class有一个main,加了一个输出到crc计算方法

public class App {
    private final static String TESTFILE = "testfile-iodd-tv7105.xml";

    public static void main(String[] args) throws IOException {
        File f = new File(Iodd.class.getClassLoader().getResource(TESTFILE).getFile());
        Iodd i = Iodd.readFile(f);
        System.out.println(i.isValid());
    }
}

IntelliJ 的输出 运行:
校验码:1195433981
CRC32: 1195433981

IntelliJ 中 Maven 测试命令的输出:
校验码:1195433981
CRC32:2019633554

谢谢。我希望现在问题已经解决了。 mvn test 从 IntelliJ 和 Bash 运行没有问题。

解决方案是我在pom.xml中为maven-surefire-plugin设置了以下配置:

  • reuseForks: 假
  • forkCount: 0
  • useSystemClassLoader: false(当 reuseForks 选项为 false 时不使用此选项的警告)
<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>
    <configuration>
        <reuseForks>false</reuseForks>
        <forkCount>0</forkCount>
        <useSystemClassLoader>false</useSystemClassLoader>
    </configuration>
</plugin>