【问题标题】:JUnit 5 @EnabledIfSystemProperty doesn't work as expectedJUnit 5 @EnabledIfSystemProperty 无法按预期工作
【发布时间】:2020-08-04 15:39:54
【问题描述】:

我将我的测试从 JUnit 4 迁移到了 JUnit 5。一切正常,但我之前的注释的翻译:

@IfProfileValue(name = "run.import.tests", values = {"true"})

进入

@EnabledIfSystemProperty(named = "run.import.tests", matches = "true")

没有按预期工作。在迁移之前,我通过参数运行了测试

-Drun.import.tests=true

只有当我通过它时,它们才会被运行。使用 Junit 5,即使使用注释 @EnabledIfSystemProperty(named = "run.import.tests", matches = "true"),即使未设置参数 run.import.tests,也会运行测试。

我做错了吗?

【问题讨论】:

    标签: java junit junit5


    【解决方案1】:

    为了使它起作用,必须添加一个“相反”的注释,所以它们一起看起来像这样:

    @EnabledIfSystemProperty(named = "run.import.tests", matches = "true")
    @DisabledIfSystemProperty(named = "run.import.tests", matches = "(?!true)")
    

    我已经检查过了,如果 run.import.tests 属性未设置或设置为除true 之外的任何其他值,则禁用测试类;如果值设置为true - 测试类未被禁用。


    奇怪的是,the documentation of @EnabledIfSystemProperty 表示:

    如果指定的系统属性未定义,注解的类或方法将被禁用。

    但它不能那样工作,它可能是一个错误。我会尝试调试 JUnit 类,如果我在他们的 GitHub 上创建问题,我会在此处链接。


    我已经检查了代码并对其进行了多次测试 - 这是摘要:

    1. 当我使用 Maven (mvn test) 运行测试时,注释 @EnabledIfSystemProperty 单独工作正常 - 仅当我添加 -Drun.import.tests=true 参数时才会运行测试。在这种情况下不需要@DisabledIfSystemProperty
    2. 当我使用 IntelliJ 的 Run XxxTest 运行测试时,只有在两个注释都存在时才能正常处理该属性。经过一些调试后,我遇到了JupiterTestEngine - 一个由外部启动器(Maven、IntelliJ 等)运行的类。似乎 IntelliJ 向它的测试启动器添加了一个属性:junit.jupiter.conditions.deactivate,这通常很有用 - 由于我们甚至可以在本地运行使用条件注释禁用的测试,而忽略它们。当@DisabledIfSystemProperty 不存在时,该属性的值为org.junit.*Enabled*Condition,而当它存在时,该属性的值为org.junit.*Disabled*Condition - 条件是为测试解析禁用状态的JUnit 扩展。

    (2)中描述的功能通常很有用,但在您的情况下,它看起来好像注释不起作用。它实际上正在工作,但 IntelliJ 只是绕过它。

    【讨论】:

    • 谢谢,它有效。我也阅读了文档中的那部分,实际上我很困惑它没有按预期工作。
    • 我在编辑中添加了一个解释,我希望它可以作为一个澄清。
    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2014-12-09
    • 2016-01-13
    • 2020-09-21
    • 2011-08-17
    • 2012-04-29
    相关资源
    最近更新 更多