AssertContains em cadeias de caracteres em jUnit

187

Existe uma maneira melhor de escrever no jUnit

String x = "foo bar";
Assert.assertTrue(x.contains("foo"));
ripper234
fonte
7
IMO isso é bom o suficiente, as opções sugeridas são menos legível
The Godfather
3
Erros de declaração mais significativas @TheGodfather menos legível, mas produzem (ou seja, a resposta aceita irá mostrar a diferença de cordas, onde, como solução PO só vai mostrar "False quando esperado True" em caso de falha)
Mike
O que torna uma afirmação "mais agradável" é a mensagem de erro quando falha. A legibilidade do código é secundária a isso, porque você não precisa olhar o código até ele falhar, e a mensagem de falha é a primeira coisa que você vê.
rjmunro 12/03

Respostas:

291

Se você adicionar o Hamcrest e o JUnit4, poderá fazer:

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

Com algumas importações estáticas, parece muito melhor:

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

As importações estáticas necessárias seriam:

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;
Yishai
fonte
8
Certifique-se de que você está usando org.junit.Assertcontra junit.framework.Assert, pois este último não tem a Hamcrest MatcherassertThat()
Visionary Software Solutions
15
Acho que ao executar o JUnit 4.10, a classe a ser usada é org.junit.matchers.JUnitMatchers, por exemplo: assertThat ("something", JUnitMatchers.containsString ("some"));
Ewen Cartwright
1
A mensagem de falha de uma falha assertThaté muito mais útil, então umaassertTrue
Mike Rylander
3
importações estáticas necessários são import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;- apenas para salvar alguém de problemas
eis
4
... e org.hamcrest.Matchers.containsString;na API mais recente, na hamcrest-librarydependência.
eis
13

use fest assert 2.0 sempre que possível EDIT: assertj pode ter mais asserções (um fork)

assertThat(x).contains("foo");
Piotrek
fonte
Não encontrei um método contains com AssertJ.assertThat. Foi isso que encontrei - org.assertj.core.api.Assertions.assertThat (conversionException) .hasMessageContaining ("some substring");
Raj
desculpe, acho que meu comentário acima não se adequa ao contexto desta resposta. Eu estava em um caso de uso diferente, em que preciso verificar se há uma substring em uma mensagem de exceção.
Raj
8

Usar o hamcrest Matcher containsString()

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

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

Você pode adicionar opcionalmente uma mensagem de erro ainda mais detalhada.

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

Postado minha resposta a uma pergunta duplicado aqui

Mike Rylander
fonte
5

Use a nova assertThatsintaxe junto com o Hamcrest .

Está disponível a partir do JUnit 4.4 .

Robert Munteanu
fonte
3

É tarde demais, mas apenas para atualizar, eu fiz com a sintaxe abaixo

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

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

Outra variante é

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

Além disso, em org.mockito.internal.matchershá algumas outras matchers interessantes, como StartWith, Containsetc.

LEON DENIS
fonte
0

variante assertj

import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);
Lazarenko Alex
fonte
0

Exemplo (versão 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
fonte
-1

Eu tentei muitas respostas nesta página, nenhuma realmente funcionou:

  • org.hamcrest.CoreMatchers.containsString não compila, não pode resolver o método.
  • JUnitMatchers.containsString está privado (e refere-se a CoreMatchers.containsString ).
  • org.hamcrest.Matchers.containsString : NoSuchMethodError

Então, em vez de escrever código legível, decidi usar a abordagem simples e viável mencionada na pergunta.

Espero que outra solução seja apresentada.

P Kuijpers
fonte