JUnit 测试在 GitHub Actions 上失败,但在本地失败

far*_*tem 5 java junit jvm github-actions

我正在尝试在 GitHub Actions 上运行 JUnit 测试,但其中一些失败。本地所有测试均已通过。在我的 PC 上,我使用 Ubuntu 20.04 和 OpenJDK 1.8 (275),在 CI 上使用 OpenJDK 1.8(来自标准操作)。

java -version电脑输出:

openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-8u275-b01-0ubuntu1~20.04-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud)

java-versionGitHub 操作的输出:

openjdk version "1.8.0_275"
OpenJDK Runtime Environment (Zulu 8.50.0.53-CA-linux64) (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (Zulu 8.50.0.53-CA-linux64) (build 25.275-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud)

测试断言:

@Test
public void test() {
    assertEquals(
        17,
        new CountingSheep(
            new Boolean[]{
                true, true, true, false,
                true, true, true, true,
                true, false, true, false,
                true, false, false, true,
                true, true, true, true,
                false, false, true, true
            }
        ).solution()
    );
}
Run Code Online (Sandbox Code Playgroud)

代码:

package com.smlnskgmail.jaman.codewarsjava.kyu8;

import java.util.Arrays;

public class CountingSheep {

    private final Boolean[] input;

    public CountingSheep(Boolean[] input) {
        this.input = input;
    }

    public int solution() {
        return (int) Arrays
                .stream(input, 0, input.length)
                .filter(b -> b != null && b)
                .count();
    }

}
Run Code Online (Sandbox Code Playgroud)

CI 检查失败并显示:

com.smlnskgmail.jaman.codewarsjava.kyu8.CountingSheepTest > test FAILED
    java.lang.AssertionError: expected:<17> but was:<0>
        at org.junit.Assert.fail(Assert.java:88)
        at org.junit.Assert.failNotEquals(Assert.java:834)
        at org.junit.Assert.assertEquals(Assert.java:645)
        at org.junit.Assert.assertEquals(Assert.java:631)
        at com.smlnskgmail.jaman.codewarsjava.kyu8.CountingSheepTest.test(CountingSheepTest.java:11)
Run Code Online (Sandbox Code Playgroud)

JUnit 实现:

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
Run Code Online (Sandbox Code Playgroud)

GitHub 操作配置:

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
Run Code Online (Sandbox Code Playgroud)

但这个测试一个月前就通过了,我无法更改代码。

包含代码的存储库:https ://github.com/fartem/codewars-java

解决方案:是带有项目反射的类。如果不执行此类,所有测试都会通过。

AlB*_*lue 2

我认为这是 GitHub 上的错误。测试似乎通过了,我在https://github.com/fartem/codewars-java/pull/1创建了一个仅包含该测试的分叉,该分叉似乎已成功通过。

鉴于唯一改变的是您的结帐操作所具体化的 Java 版本,我想知道 GitHub 是否有一个暂时损坏的 Java 版本已回滚。

Boolean顺便说一句,您在测试中使用了一个数组,但在这种情况下,您可以使用一个数组boolean来代替——这样,您的过滤器就不需要b != null在那里进行检查。

--

根据fartem 的观察,还有一段额外的代码运行并更改了Boolean.TRUEto的值false。变化是测试的随机排序。

 Field field = Boolean.class.getField("TRUE");
 field.setAccessible(true);

 Field modifiedField = Field.class.getDeclaredField("modifiers");
 modifiedField.setAccessible(true);
 modifiedField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

 field.set(null, false);
Run Code Online (Sandbox Code Playgroud)

因此,在此测试运行后对布尔值使用自动装箱的任何测试都会得到错误的结果。