gpt4 book ai didi

java - 我的开启断言的 JUnit 规则似乎没有在我们的 Jenkins 构建上执行

转载 作者:行者123 更新时间:2023-11-29 05:52:51 27 4
gpt4 key购买 nike

我希望整个代码中的断言失败都会导致我的测试失败。

我有一个像这样的 JUnit 规则:

public class AcmeTestRule implements TestRule {
@Override
public Statement apply(final Statement statement, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
ClassLoader classLoader = getClass().getClassLoader();
classLoader.clearAssertionStatus();
classLoader.setDefaultAssertionStatus(true);
//classLoader.setPackageAssertionStatus("com.acme", true); // no effect

statement.evaluate();
}
}
}
}

它在这样的基础测试类上:

public abstract class AcmeTestCase {
@ClassRule
public static final AcmeTestRule acmeTestRule = new AcmeTestRule();
}

然后为了确认规则本身有效,我进行了以下测试:

public class TestAcmeTestRule extends AcmeTestCase4 {
@Test
public void testAssertions() {
try {
assert false;
} catch (AssertionError) {
// good.
return;
}

fail("Didn't throw AssertionError on assert false");
}
}

我们的自动构建测试失败,因为“assert false”仍然没有抛出异常。从 IDE 运行完全相同的测试通过。我们没有设置任何命令行标志来打开断言(尽管 IDE 可能在我们背后这样做。)

顺便说一句,如果我这样做:

public class TestAcmeTestRule {
@ClassRule
public static final AcmeTestRule acmeTestRule = new AcmeTestRule();

@Test
public void testAssertions() {
try {
assert false;
} catch (AssertionError) {
// good.
return;
}

fail("Didn't throw AssertionError on assert false");
}
}

生成的测试现在在 IDE 中也失败了。我所做的只是将规则从抽象类向下移动到测试类中。

我认为这是一些奇怪的类加载问题。我的理论:断言状态仅在读取字节码时使用,因此当您运行字节码时,更改该值已为时已晚。

最佳答案

ClassLoader.setDefaultAssertionStatus(以及所有类似的方法)的问题是,它们对已经加载的类没有影响。来自documentation

This setting determines whether classes loaded by this class loader and initialized in the future will have assertions enabled or disabled by default.

因此,只要您不确保在加载所有其他类之前执行断言(这可能很容易出错),您就无法在代码中可靠地启用断言。

这在 IDE 中起作用的原因可能是 IDE 倾向于通过传递适当的命令行参数来启用断言,或者类加载的顺序可能不同。

关于java - 我的开启断言的 JUnit 规则似乎没有在我们的 Jenkins 构建上执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13263903/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com