在 eclipse IDE 上的 junit 测试中使用 @Rule 的 ExpectedException 不起作用

ExpectedException with @Rule in junit test on eclipse IDE does not work

我需要在 junit 中做一个测试,在抛出异常时通过,但一次又一次失败。

我在 Whosebug 和其他资源中阅读了关于该主题的大量问题和答案。最终我看到了这个页面,它解释了 Class ExpectedException 的用法,作者是 junit.org。

由于我自己的测试无法正常工作,所以我复制了他们的基本示例,但它仍然无法正常工作。

这是我的代码:

import static org.junit.jupiter.api.Assertions.*;

import org.junit.Rule;
import org.junit.jupiter.api.Test;
import org.junit.rules.ExpectedException;

class AssertExceptionTest {
    
    @Rule
    public ExpectedException thrown= ExpectedException.none();

    @Test
    public void throwsNothing() {
        // no exception expected, none thrown: passes.
    }

    @Test
    public void throwsExceptionWithSpecificType() {
        thrown.expect(NullPointerException.class);
        throw new NullPointerException();
    }
}

引用我上面提到的页面,解释是“...指定预期异常的类型后,当抛出此类异常时,您的测试成功如果抛出不同的异常或没有抛出异常则失败...

问题是无论我做什么,测试仍然失败,失败是因为我试图验证:抛出 NullPointerException。

我想也许是因为我使用的是 junit 5,所以我的测试失败了。然而,来自 Whosebug 的 提出了不同的建议:提出问题的人提到他在 eclipse 中使用 junit 5 的方式与我的代码相同,并且成功。

技术细节: 日食版本:2019-12 (4.14.0) 联合版本:联合5 正在开发 Ubuntu,版本:18.04.2 LTS。

更新: 我使用了 assertThrows(),它对我有用。但是,我还是很纳闷,为什么我用上面介绍的很多人推荐的方法都没有成功。

提前致谢!

JUnit 5 不支持开箱即用的 JUnit 4 规则。

要使您的代码正常工作:

  1. 添加以下依赖(当然,版本可能会随时间变化)
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-migrationsupport</artifactId>
    <version>5.5.2</version> 
    <scope>test</scope>
</dependency>
  1. 接下来,将 @EnableRuleMigrationSupport 置于测试 class 之上。

就是这样。有关详细信息,请参阅 this