AssertContains na ciągi znaków w jUnit

187

Czy istnieje lepszy sposób pisania w jUnit?

String x = "foo bar";
Assert.assertTrue(x.contains("foo"));
ripper234
źródło
7
IMO jest to dość miłe, sugerowane opcje są mniej czytelne
Ojciec Chrzestny
3
@ TheGodfather jest mniej czytelny, ale produkuje bardziej znaczące błędy asertywne (tj. Zaakceptowana odpowiedź pokaże różnicę w ciągach, gdzie jako rozwiązanie OP pokaże po prostu „Fałsz, gdy oczekiwany Prawda” w przypadku niepowodzenia)
Mike
Tym, co czyni aser „ładniejszym”, jest komunikat o błędzie, gdy się nie powiedzie. Jak czytelny jest w kodzie, ma to drugorzędne znaczenie, ponieważ nie musisz patrzeć na kod, dopóki się nie powiedzie, a komunikat o błędzie jest pierwszą rzeczą, którą zobaczysz.
rjmunro

Odpowiedzi:

291

Jeśli dodasz Hamcrest i JUnit4, możesz:

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

W przypadku niektórych importów statycznych wygląda to znacznie lepiej:

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

Wymagany import statyczny to:

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;
Yishai
źródło
8
Upewnij się, że używasz org.junit.Assertkontra junit.framework.Assert, ponieważ ten drugi nie ma Hamcrest MatcherassertThat()
Visionary Software Solutions
15
Myślę, że podczas uruchamiania JUnit 4.10 klasą do użycia jest org.junit.matchers.JUnitMatchers, np .: assertThat („coś”, JUnitMatchers.containsString („niektóre”));
Ewen Cartwright
1
Komunikat o niepowodzeniu assertThatjest o wiele bardziej pomocny niżassertTrue
Mike Rylander
3
import statyczne są potrzebne import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;- wystarczy, aby uratować kogoś z kłopotów
eis
4
... i org.hamcrest.Matchers.containsString;w najnowszym API, w hamcrest-libraryzależności.
eis
13

w miarę możliwości używaj fest assert 2.0 EDYCJA: assertj może mieć więcej asercji (rozwidlenie)

assertThat(x).contains("foo");
piotrek
źródło
Nie znalazłem metody zawierającej metodę AssertJ.assertThat. Właśnie to znalazłem - org.assertj.core.api.Assertions.assertThat (wyjątek konwersji) .hasMessageContaining („niektóre podciągi”);
Raj
przepraszam, myślę, że mój powyższy komentarz nie pasuje do kontekstu tej odpowiedzi. Miałem inny przypadek użycia, w którym muszę sprawdzić podciąg w komunikacie wyjątku.
Raj
8

Użyj narzędzia Hamcrest Matcher containsString()

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

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

Możesz opcjonalnie dodać jeszcze bardziej szczegółowy komunikat o błędzie.

// 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"

Wysłany moją odpowiedź na pytanie duplikatu tutaj

Mike Rylander
źródło
5

Użyj nowej assertThatskładni razem z Hamcrestem .

Jest dostępny od wersji JUnit 4.4 .

Robert Munteanu
źródło
3

Jest już za późno, ale tylko do aktualizacji mam to zrobione z poniższą składnią

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

Assert.assertThat("this contains test", StringContains.containsString("test"));
rns
źródło
2

Innym wariantem jest

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

Ponadto w org.mockito.internal.matchersistnieje kilka innych ciekawych dopasowujących, jak StartWith, Containsetc.

LEON DENIS
źródło
0

wariant assertj

import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);
Lazarenko Alex
źródło
0

Przykład (wersja 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");
 }

}
Muriithi Derrick
źródło
-1

Wypróbowałem wiele odpowiedzi na tej stronie, żadna tak naprawdę nie działała:

  • org.hamcrest.CoreMatchers.containsString nie kompiluje się, nie może rozwiązać metody.
  • JUnitMatchers.containsString jest osłabiony (i odnosi się do CoreMatchers.containsString ).
  • org.hamcrest.Matchers.containsString : NoSuchMethodError

Dlatego zamiast pisać czytelny kod, zdecydowałem się zastosować proste i praktyczne podejście wspomniane w pytaniu.

Mam nadzieję, że pojawi się inne rozwiązanie.

P Kuijpers
źródło