用于大字符串比较的 assertThat 与 assertEquals

assertThat vs assertEquals for big String comparison

每个人都说我们应该使用 Junit 的新 assertThat,但是,对于大字符串比较,它似乎缺少一些功能。

示例:

@Test
public void testAssertThat() throws Exception {
    Assert.assertThat("auiehaeiueahuiheauihaeuieahuiaehuieahuaiehiaueheauihaeuihaeuiaehuiaehuiaehuiaehaeuihaei",
            CoreMatchers.equalTo( "auiehaeiueahuiheauihaeuieahuiaehuieaheaiehiaueheauihaeuihaeuiaehuiaehuiaehuiaehaeuihaei" ) );
}

@Test
public void testAssertEquals() throws Exception {
    Assert.assertEquals( "auiehaeiueahuiheauihaeuieahuiaehuieahuaiehiaueheauihaeuihaeuiaehuiaehuiaehuiaehaeuihaei",
            "auiehaeiueahuiheauihaeuieahuiaehuieaheaiehiaueheauihaeuihaeuiaehuiaehuiaehuiaehaeuihaei" );
}

assertEquals 打印更易于阅读的错误消息:

org.junit.ComparisonFailure: expected:<...uihaeuieahuiaehuieah[u]aiehiaueheauihaeuiha...> but was:<...uihaeuieahuiaehuieah[e]aiehiaueheauihaeuiha...>

assertThat 打印此:

java.lang.AssertionError: Expected: "auiehaeiueahuiheauihaeuieahuiaehuieaheaiehiaueheauihaeuihaeuiaehuiaehuiaehuiaehaeuihaei" but: was "auiehaeiueahuiheauihaeuieahuiaehuieahuaiehiaueheauihaeuihaeuiaehuiaehuiaehuiaehaeuihaei"

有没有办法获得与 assertThat 相同的行为?

友好的消息 org.junit.ComparisonFailure: expected... 来自这样一个事实,即 JUnit 使用 assertEquals 和 String 作为输入的方式。 这样,如果 String 比较失败,Junit 将抛出 org.junit.ComparisonFailure。

在您的 IDE 中,比较确实更具可读性。例如在Eclipse中,双击失败的Junit测试可以显示字符串比较。

像这样:

AssertThat 具有不同的语义,javadoc 明确指出: Asserts that actual satisfies the condition specified by matcher. If not, an AssertionError is thrown with information about the matcher and failing value. 顾名思义,AssertionError 的语义范围更广。

总结:如果你想保留 String 的友好信息,你应该继续使用 AssertEquals 进行 String 比较。