AssertContains en cadenas en jUnit

187

¿Hay una mejor manera de escribir en jUnit?

String x = "foo bar";
Assert.assertTrue(x.contains("foo"));
ripper234
fuente
77
En mi opinión, esto es bastante agradable, las opciones sugeridas son menos legibles
The Godfather
3
@TheGodfather es menos legible, pero produce errores de afirmación más significativos (es decir, la respuesta aceptada mostrará la diferencia en cadenas, mientras que la solución de OP solo mostrará "Falso cuando se espera Verdadero" en caso de falla)
Mike
Lo que hace que una afirmación sea "más agradable" es el mensaje de error cuando falla. Lo legible que es en el código es secundario a eso, porque no tiene que mirar el código hasta que falla, y el mensaje de falla es lo primero que ve.
rjmunro

Respuestas:

291

Si agrega Hamcrest y JUnit4, podría hacer:

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

Con algunas importaciones estáticas, se ve mucho mejor:

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

Las importaciones estáticas necesarias serían:

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;
Yishai
fuente
8
Asegúrese de usar org.junit.Assertversus junit.framework.Assert, ya que este último no tiene el Hamcrest MatcherassertThat()
Visionary Software Solutions
15
Creo que cuando se ejecuta JUnit 4.10, la clase a usar es org.junit.matchers.JUnitMatchers, por ejemplo: afirmar eso ("algo", JUnitMatchers.containsString ("algunos"));
Ewen Cartwright
1
El mensaje de falla para una falla assertThates mucho más útil que unassertTrue
Mike Rylander
3
importaciones estáticas necesarias son import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;- sólo para salvar a alguien de problemas
EIS
44
... y org.hamcrest.Matchers.containsString;en la última api, en la hamcrest-librarydependencia.
EIS
13

use fest afirmar 2.0 siempre que sea posible EDITAR: afirmar puede tener más aserciones (una bifurcación)

assertThat(x).contains("foo");
piotrek
fuente
No encontré un método contiene con AssertJ.assertThat. Esto es lo que encontré en su lugar: org.assertj.core.api.Assertions.assertThat (conversionException) .hasMessageContaining ("alguna subcadena");
Raj
lo siento, creo que mi comentario anterior no se ajusta al contexto de esta respuesta. Estaba en un caso de uso diferente donde necesito verificar una subcadena dentro de un mensaje de excepción.
Raj
8

Utilice el Hamcrest Matcher containsString()

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

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

Opcionalmente, puede agregar un mensaje de error aún más detallado.

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

Publiqué mi respuesta a una pregunta duplicada aquí

Mike Rylander
fuente
5

Use la nueva assertThatsintaxis junto con Hamcrest .

Está disponible a partir de JUnit 4.4 .

Robert Munteanu
fuente
3

Es demasiado tarde, pero solo para actualizar lo hice con la siguiente sintaxis

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

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

Otra variante es

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

Además, org.mockito.internal.matchershay algunos otros matizadores interesantes, como StartWith, Containsetc.

LEON DENIS
fuente
0

variante de aserción

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

Ejemplo (versión 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");
 }

}
Torre de Muriithi
fuente
-1

He probado muchas respuestas en esta página, ninguna realmente funcionó:

  • org.hamcrest.CoreMatchers.containsString no compila, no puede resolver el método.
  • JUnitMatchers.containsString es depricated (y se refiere a CoreMatchers.containsString ).
  • org.hamcrest.Matchers.containsString : NoSuchMethodError

Entonces, en lugar de escribir código legible, decidí usar el enfoque simple y viable mencionado en la pregunta.

Esperemos que surja otra solución.

P Kuijpers
fuente