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


187

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

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

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");

Я не нашел метод содержимого с 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"

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



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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.