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

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;

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

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



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

2

Outra variante é

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

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


0

variante assertj

import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);

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

}

-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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.