AssertContains на рядках в jUnit


187

Чи є приємніший спосіб писати в jUnit

String x = "foo bar";
Assert.assertTrue(x.contains("foo"));

7
IMO це досить приємно, запропоновані варіанти менш читабельні
Хрещений батько

3
@TheGodfather менш читабельний, але створює більш значущі помилки твердження (тобто прийнята відповідь покаже різницю в рядках, де як ОП рішення просто показуватиме "Неправдиво, коли очікується, що правда" на помилку)
Майк

Що робить твердження «приємнішим» - це повідомлення про помилку, коли воно не працює. Наскільки читабельна вона в коді, це другорядне значення, тому що вам не потрібно дивитись на код, поки він не виходить з ладу, а повідомлення про помилку - це перше, що ви бачите.
rjmunro

Відповіді:


291

Якщо ви додасте в Hamcrest та JUnit4, ви можете зробити:

String x = "foo bar";
Assert.assertThat(x, CoreMatchers.containsString("foo"));

Зі статичним імпортом це виглядає набагато краще:

assertThat(x, containsString("foo"));

Необхідним статичним імпортом було б:

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;

8
Будьте впевнені, що ви використовуєте org.junit.Assertпорівняно junit.framework.Assert, оскільки останній не має Hamcrest MatcherassertThat()
Visionary Software Solutions

15
Я думаю, що при запуску JUnit 4.10 клас для використання - org.junit.matchers.JUnitMatchers, наприклад: assertThat ("щось", JUnitMatchers.containsString ("деякий"));
Евен Картрайт

1
Повідомлення про невдачу assertThat- це набагато корисніше ніжassertTrue
Майк Райландер

3
статичний імпорт Необхідний import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;- просто щоб врятувати кого - то від біди
ейс

4
... і org.hamcrest.Matchers.containsString;в останніх api, в hamcrest-libraryзалежності.
eis

13

будь-коли використовувати fest assert 2.0 EDIT: assertj може мати більше тверджень (вилка)

assertThat(x).contains("foo");

Я не знайшов метод містить метод AssertJ.assertThat. Це те, що я знайшов замість цього - org.assertj.core.api.Assertions.assertThat (конверсіяException) .hasMessageContain ("деяка підрядка");
Радж

вибачте, я думаю, що мій вище коментар не відповідає контексту цієї відповіді. Я був у іншому випадку використання, коли мені потрібно перевірити наявність підрядка в повідомленні про виключення.
Радж

8

Використовуйте сімейство молотків containsString()

// Hamcrest assertion
assertThat(person.getName(), containsString("myName"));

// Error Message
java.lang.AssertionError:
Expected: a string containing "myName"
     got: "some other name"

Ви можете за бажанням додати ще більш детальне повідомлення про помилку.

// Hamcrest assertion with custom error message
assertThat("my error message", person.getName(), containsString("myName"));

// Error Message
java.lang.AssertionError: my error message
Expected: a string containing "myName"
     got: "some other name"

Повідомлення моєї відповіді на дублюючий питання тут



3

Це вже пізно, але просто для оновлення я це зробив із синтаксисом нижче

import org.hamcrest.core.StringContains;
import org.junit.Assert;

Assert.assertThat("this contains test", StringContains.containsString("test"));

2

Інший варіант є

Assert.assertThat(actual, new Matches(expectedRegex));

Більше того, org.mockito.internal.matchersє ще деякі цікаві відповідники, наприклад StartWith, Containsтощо.



0

Приклад (версія для верху 4.13)

import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;

public class TestStr {

@Test
public void testThatStringIsContained(){
    String testStr = "hi,i am a test string";
    assertThat(testStr).contains("test");
 }

}

-1

Я спробував багато відповідей на цій сторінці, жодна дійсно не працювала:

  • org.hamcrest.CoreMatchers.containsString не компілюється, не може вирішити метод.
  • JUnitMatchers.containsString оприлюднено (і стосується CoreMatchers.containsString ).
  • org.hamcrest.Matchers.containsString : NoSuchMethodError

Тож замість того, щоб написати читабельний код, я вирішив скористатися простим та працездатним підходом, згаданим у питанні.

Сподіваємось, знайдеться інше рішення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.