当JUnit 5没有assertThat()函数时,如何将Hamcrest与JUnit 5一起使用?

Max*_*Max 32 java hamcrest assertthat junit5

要将Hamcrest与JUnit 4一起使用,我们使用一个assertThat()函数.但是,JUnit 5不再具有assertThat()功能.如何在没有Hamcrest的情况下使用assertThat()

Max*_*Max 40

您必须确保Hamcrest包含在类路径中,然后使用assertThat()Hamcrest提供的功能.从当前的JUnit 5用户指南 - 编写测试断言,

JUnit Jupiter的org.junit.jupiter.Assertions类不提供类似于JUnit 4的org.junit.Assert类中的assertThat()方法,该类接受Hamcrest Matcher.相反,鼓励开发人员使用第三方断言库提供的对匹配器的内置支持.

以下示例演示如何在JUnit Jupiter测试中使用Hamcrest的assertThat()支持.只要将Hamcrest库添加到类路径中,就可以静态导入assertThat(),is()和equalTo()等方法,然后在下面的assertWithHamcrestMatcher()方法中使用它们.

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

import org.junit.jupiter.api.Test;

class HamcrestAssertionDemo {

    @Test
    void assertWithHamcrestMatcher() {
        assertThat(2 + 1, is(equalTo(3)));
    }

}
Run Code Online (Sandbox Code Playgroud)

当然,基于JUnit 4编程模型的遗留测试可以继续使用org.junit.Assert#assertThat."

  • JUnit 5团队面临的选择是要么实现一个完整的"现代"断言lib,要么只提供最低限度,并将智能断言留给外部库.团队选择后者.Junit4所做的是在外部依赖中绘制.在一个特定版本的Hamcrest上,后来被认为是一个错误,因为它导致了许多具有冲突版本的probs.因此,没有外部代表AT ALL是JUnit 5核心的基本规则. (13认同)
  • 令我震惊的是,`assertThat`应该是执行所有断言的新方法,然后突然JUnit 5出来了,并且不知何故仍然拥有所有遗留断言方法,但也删除了唯一的现代断言.他们已经致力于打破API,所以你认为他们真的可以去那里并删除所有冗余的断言方法.最初我认为可能是为了方便迁移,但不是,参数顺序甚至不一样. (11认同)
  • @Trejkaz 品味和设计判断显然不同。 (2认同)

GKi*_*lin 8

https://github.com/junit-team/junit5/issues/147

您可以在 JUnit5 中同时使用 Hamcrest 和 AssertJ。这两个框架都有一个简单的 assertThat 方法,您可以根据需要导入和使用。

目前,我们不打算在我们自己的断言中支持这些框架以避免依赖。尽管如此,人们仍然可以很好地使用它们。