java - real - la moneda de brasil 2018
¿Cómo afirmar un valor real contra 2 o más valores esperados? (13)
Estoy probando un método para ver si devuelve la cadena correcta. Esta cadena se compone de muchas líneas cuyo orden puede cambiar, por lo tanto, generalmente da 2 combinaciones posibles. Ese orden no es importante para mi aplicación.
Sin embargo, debido a que el orden de las líneas puede cambiar, escribir solo una declaración Assert no funcionará, ya que algunas veces pasará la prueba y otras fallará la prueba.
Entonces, ¿es posible escribir una prueba que afirme un valor de cadena real contra 2 o más valores de cadena esperados y ver si es igual a alguno de ellos?
Considere la posibilidad de escribir un emparejador hamcrest personalizado devuelto por un método, en este caso, containsOneOf
, es decir:
assertThat(myString, containsOneOf("value1", "value2"));
De acuerdo con los "patrones xUnit", debe evitar la lógica condicional en su emparejador, un bucle con una declaración de ruptura debería ser suficiente.
Eche un vistazo a Hamcrest y xUnit Patterns para obtener más información.
Creo que puedes usar assertTrue:
assertTrue(testString.matches("string1|string2"));
El más simple / eficiente podría ser
assert str.equals(result1) || str.equals(result2);
Esto efectivamente no tendrá gastos generales cuando no tenga activadas las aserciones.
Es una publicación antigua, pero quería tener una respuesta nativa y sencilla, sin tener que agregar bibliotecas adicionales. :)
Así que lo hice :
String e
e = "ear"
j = "jars"
assert (j == "jar" || e == "ear")
o si quieres que sean ambas verdaderas
assert (j == "jar" && e == "ear")
Estoy usando lo siguiente, espero que esto ayude:
String expectedTitles[] = {"Expected1","Expected2"};
List<String> expectedTitlesList = Arrays.asList(expectedTitles);
assertTrue(expectedTitlesList.contains((actualTitle)));
Estoy usando lo siguiente:
assert expected1.equals(actual) || expected2.equals(actual);
Leí todas las respuestas, pero la que me parece más compacta y expresiva es usar isOneOf de isOneOf
que ya está incluida en JUnit
assertThat(result, isOneOf("value1", "value2"));
lo que le da un buen mensaje de error cuando falla.
java.lang.AssertionError:
Expected: one of {"value1", "value2"}
but: was "value"
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
[...]
Puedes usar Hamcrest para esto:
assertThat(testString, anyOf(
containsString("My first string"),
containsString("My other string")));
(Veo que Joachim acaba de responder de manera muy similar (+1) ... agregaré esto como otro ejemplo).
Si el contenido de una línea es fijo, puede dividirlo en los finales de línea antes de comparar. Luego, simplemente compare cada línea con un conjunto de valores esperados. Algo como esto:
Set<String> expectedValues = ...
String[] split = text.split("/n");
for(String str : split) {
assert(expectedValues.contains(str));
}
Si desea verificar que todos los valores esperados están presentes, puede afirmar que expectedValue.remove(str) == true
y afirmar después del bucle que el conjunto está vacío. Si algunas líneas pueden aparecer varias veces, tiene que usar una Bolsa en lugar de un Conjunto.
Si usas junit, solo haría algo como lo siguiente:
assertTrue(myString.equals("Value1") || myString.equals("Value"));
Suponiendo que el método bajo prueba devuelve una matriz, puede probar utilizando arrayContainingInAnyOrder de arrayContainingInAnyOrder .
assertThat(result, is(arrayContainingInAnyOrder("value1", "value2", "value")))
Nota: el uso de is
envoltura es puramente opcional, se usa solo como azúcar de legibilidad.
Yo usaría AssertJ para esto:
assertThat("hello").isIn("hello", "world");
Es más conciso y le dará un mensaje descriptivo cuando la afirmación falla.
Uso de Hamcrest CoreMatcher
(incluido en JUnit 4.4 y assertThat()
posteriores) y assertThat()
:
assertThat(myString, anyOf(is("value1"), is("value2"));