2015-01-30 7 views
3

Все говорят, что мы должны использовать новый assertThat от Junit, но для большого сравнения Strings это, по-видимому, некоторая нехватка функции.assertThat vs assertEquals для сравнения больших строк

Пример:

@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?

+0

Вы пробовали '' assertThat (actual, is (equalTo (expected))) ''? – user1438038

+0

есть, такой же проблема. – caarlos0

+0

Возможно, вы можете каким-то образом использовать Groovy PowerAssert. – Crazyjavahacking

ответ

3

Дружественное сообщение org.junit.ComparisonFailure: expected... связано с тем, что JUnit работает с assertEquals и со String в качестве входных данных. Таким образом, Junit бросает org.junit.ComparisonFailure, если сравнение строк не выполняется.

В вашей IDE сравнение более читаемо. Например, в Eclipse вы можете дважды щелкнуть неудачный тест Junit, чтобы отобразить сравнение строк.

Как это:

enter image description here

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 для сравнения строк.

Смежные вопросы