Assert Содержит строки в jUnit

187

Есть ли лучший способ написать в jUnit

String x = "foo bar";
Assert.assertTrue(x.contains("foo"));
ripper234
источник
7
ИМО, это достаточно приятно, предлагаемые варианты менее читабельны
Крестный отец
3
@TheGodfather менее читабелен, но выдает более значимые ошибки утверждений (т. Е. Принятый ответ покажет разницу в строках, в то время как решение OP просто покажет «False, когда ожидается True» при
Майк
Что делает утверждение «лучше», так это сообщение об ошибке, когда оно терпит неудачу. Насколько читабельным он является в коде, является вторичным по отношению к этому, потому что вам не нужно смотреть на код, пока он не выйдет из строя, и сообщение об ошибке - первое, что вы увидите.
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зависимости.
эйс
13

по возможности используйте fest assert 2.0. РЕДАКТИРОВАТЬ: assertj может иметь больше утверждений (разветвление)

assertThat(x).contains("foo");
Piotrek
источник
Я не нашел метод содержимого с AssertJ.assertThat. Это то, что я нашел вместо этого - org.assertj.core.api.Assertions.assertThat (translationException) .hasMessageContained ("некоторая подстрока");
Радж
извините, я думаю, что мой комментарий выше не соответствует контексту этого ответа. Я был в другом случае, когда мне нужно проверить подстроку в сообщении об исключении.
Радж
8

Используйте Matcher Hamcrest 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"

Разместил мой ответ на дубликат вопроса здесь

Майк Райландер
источник
5

Используйте новый assertThatсинтаксис вместе с Hamcrest .

Доступно начиная с JUnit 4.4 .

Роберт Мунтяну
источник
3

Слишком поздно, но просто для обновления я сделал это с приведенным ниже синтаксисом

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

Assert.assertThat("this contains test", StringContains.containsString("test"));
RNS
источник
2

Другой вариант

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

Кроме того, org.mockito.internal.matchersесть и другие интересные совпадения, например StartWith, Containsи т. Д.

ЛЕОН ДЕНИС
источник
0

Assertj вариант

import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);
Лазаренко Алексей
источник
0

Пример (версия junit - 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

Поэтому вместо написания читабельного кода я решил вместо этого использовать простой и работоспособный подход, упомянутый в вопросе.

Надеюсь, найдется другое решение.

П Куйперс
источник