Org.junit.Assert.assertThat 是否比 org.hamcrest.MatcherAssert.assertThat 更好?

2022-09-02 03:38:05

我是JUnit和Hamcrest的新手,希望获得最佳实践建议,以便我可以决定首先学习哪些文档。

对于初学者来说,这些方法中哪一种更好?assertThat

  1. org.junit.Assert.assertThat (来自 junit-4.11.jar)
  2. org.hamcrest.MatcherAssert.assertThat (来自 hamcrest-core-1.3.jar)

据去年的一位人士说,“JUnit有asserutionThat方法,但hamcrest有自己的assertThat方法,可以做同样的事情

根据今年早些时候的某人的说法,Hamcrest“可能会提供更好的错误消息,因为匹配器被调用来描述不匹配”。

很难说在这些帖子中比较了哪些版本的Junit和Hamcrest。因此,我希望根据最新发布的版本进行推荐。


答案 1

几乎是一回事。

JUnit的最新版本现在包括hamcrest。

事实上,org.junit.Assert.assertthat 的方法签名是

public static <T> void assertThat(T actual,
                              org.hamcrest.Matcher<T> matcher)

你会注意到使用hamcrest匹配器。

您可能仍然希望包含自己的hamcrest版本,因为JUnit不会经常更新,并且可能并不总是使用最新版本的hamcrest。

根据 maven pom 的说法,JUnit 4.11 使用 hamcrest 1.3,我认为这是在撰写本文时最新的。

编辑我刚刚 http://blog.code-cop.org/2014/02/assert-or-matcherassert.html 阅读了您的第二篇文章,它描述了hamcrest的2个细微差异,使其更有用:assertThat

  1. 当匹配失败时,错误消息包括不同的内容,而不是“预期的 X,但为 Y”。自定义hamcrest匹配器可能包括有关通过实现的确切错误的更多详细信息。describeMismatch()
  2. 在hamcrest中使用签名是不同的,它允许匹配器是超类型(如匹配器比较整数和双精度)。这通常无关紧要,但是当您需要它时,这是一个不错的功能。assertThatT actual, Matcher<? super T> matcher

所以使用.org.hamcrest.MatcherAssert.assertThat


答案 2

摘自 JUnit 5 的用户指南

然而,JUnit Jupiter的类没有提供像JUnit 4类中发现的那样接受Hamcrest的方法。相反,鼓励开发人员使用第三方断言库提供的对匹配器的内置支持。org.junit.jupiter.AssertionsassertThat()org.junit.AssertMatcher

我认为对于JUnit 4,Hamcrest是(官方)首选。assertThat


推荐