AssertContains en cadenas en jUnit


187

¿Hay una mejor manera de escribir en jUnit?

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

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;

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

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í



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

2

Otra variante es

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

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


0

variante de aserción

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

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

}

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.