¿Alguien sabe por qué JUnit 4 proporciona assertEquals(foo,bar)
pero no assertNotEqual(foo,bar)
métodos?
Proporciona assertNotSame
(correspondiente a assertSame
) y assertFalse
(correspondiente a assertTrue
), por lo que parece extraño que no se molesten en incluirlo assertNotEqual
.
Por cierto, sé que JUnit-addons proporciona los métodos que estoy buscando. Solo pregunto por curiosidad.
Respuestas:
Te sugiero que uses
assertThat()
las afirmaciones de estilo más nuevas , que pueden describir fácilmente todo tipo de negaciones y crear automáticamente una descripción de lo que esperabas y lo que obtienes si la afirmación falla:Las tres opciones son equivalentes, elija la que le resulte más legible.
Para usar los nombres simples de los métodos (y permitir que esta sintaxis de tiempo funcione), necesita estas importaciones:
fuente
assertNotEquals()
.assertNotEqual
", diría que es porque es una afirmación especializada que no se necesita con tanta frecuenciaassertEquals
y, por lo tanto, se expresaría a través del genéricoassertFalse
.assertThat
es mucho más expresivo que el conjunto limitado deassert*
métodos disponibles. Por lo tanto, puede expresar las restricciones exactas en una sola línea, hacer que (casi) se lea como una oración en inglés y obtener un mensaje significativo cuando la afirmación falla. Por supuesto, esa no siempre es una característica excelente, pero cuando la haya visto en acción varias veces, verá cuánto valor agrega.assertThat
es más expresivo queassert*
, pero no creo que sea más expresivo que la expresión java que puedes poner dentro y fuera de laassert*
expresión en general (después de todo, puedo expresar cualquier cosa en código java). Es un problema general que he empezado a encontrar con API de estilo fluido: cada una es básicamente una nueva DSL que debes aprender (¡cuando todos ya conocemos la Java!). Sin embargo, supongo que Hamcrest es lo suficientemente ubicuo ahora que es razonable esperar que la gente lo sepa. Voy a jugar ...Hay un
assertNotEquals
en JUnit 4.11: https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md#improvements-to-assert-and-assumefuente
Me pregunto lo mismo. La API de Assert no es muy simétrica; para probar si los objetos son iguales, proporciona
assertSame
yassertNotSame
.Por supuesto, no es demasiado largo para escribir:
Con tal afirmación, la única parte informativa de la salida es, lamentablemente, el nombre del método de prueba, por lo que el mensaje descriptivo debe formarse por separado:
Eso es, por supuesto, tan tedioso, que es mejor rodar el tuyo
assertNotEqual
. Por suerte en el futuro, tal vez sea parte de JUnit: JUnit número 22fuente
Yo diría que la ausencia de afirmarNotEqual es de hecho una asimetría y hace que JUnit sea un poco menos fácil de aprender. Tenga en cuenta que este es un buen caso cuando agregar un método disminuiría la complejidad de la API, al menos para mí: la simetría ayuda a gobernar el espacio más grande. Supongo que la razón de la omisión puede ser que hay muy pocas personas que solicitan el método. Sin embargo, recuerdo un momento en que incluso afirmar Falso no existía; por lo tanto, tengo una expectativa positiva de que el método eventualmente podría agregarse, dado que no es difícil; aunque reconozco que existen numerosas soluciones, incluso elegantes.
fuente
Llego a esta fiesta bastante tarde, pero he encontrado que la forma:
se puede hacer que funcione para la mayoría de los casos "no iguales".
fuente
Estoy trabajando en JUnit en el entorno java 8, usando jUnit4.12
para mí: el compilador no pudo encontrar el método ClaimNotEquals, incluso cuando usé
import org.junit.Assert;
Entonces cambié
assertNotEquals("addb", string);
a
Assert.assertNotEquals("addb", string);
Entonces, si enfrenta un problema relacionado con
assertNotEqual
no reconocido, cámbielo aAssert.assertNotEquals(,);
él para resolver su problemafuente
import static org.junit.Assert.*;
y podrá usar todas las afirmaciones sin el nombre de la clase.La razón obvia por la que las personas querían afirmarNotEquals () era comparar las construcciones sin tener que convertirlas primero en objetos completos:
Ejemplo detallado:
vs.
Lamentablemente, dado que Eclipse no incluye JUnit 4.11 de forma predeterminada, debe ser detallado.
Advertencia No creo que el '1' deba estar envuelto en un Integer.valueOf (), pero dado que acabo de regresar de .NET, no cuente con mi corrección.
fuente
Es mejor usar Hamcrest para afirmaciones negativas en lugar de afirmar Falso, ya que en el primero el informe de prueba mostrará una diferencia para el fracaso de la afirmación.
Si usa afirmarFalso, solo obtendrá un error de aserción en el informe. es decir, pérdida de información sobre la causa del fallo.
fuente
Por lo general, hago esto cuando espero que dos objetos sean iguales:
y:
cuando se espera que sean desiguales. Soy consciente de que esta no es una respuesta a su pregunta, pero es lo más cerca que puedo llegar. Podría ayudar a otros a buscar lo que pueden hacer en las versiones de JUnit anteriores a JUnit 4.11.
fuente
Estoy totalmente de acuerdo con el punto de vista OP.
Assert.assertFalse(expected.equals(actual))
No es una forma natural de expresar una desigualdad.Pero diría que, además
Assert.assertEquals()
,Assert.assertNotEquals()
funciona , pero no es fácil de usar para documentar lo que la prueba realmente afirma y entender / depurar cuando falla la afirmación.Entonces sí JUnit 4.11 y JUnit 5 proporciona
Assert.assertNotEquals()
(Assertions.assertNotEquals()
en JUnit 5) pero realmente evito usarlos.Como alternativa, para afirmar el estado de un objeto, generalmente uso una API de comparación que profundiza en el estado del objeto fácilmente, documenta claramente la intención de las afirmaciones y es muy fácil de entender para el usuario la causa de la falla de la afirmación.
Aquí hay un ejemplo.
Supongamos que tengo una clase Animal en la que quiero probar el
createWithNewNameAndAge()
método, un método que crea un nuevo objeto Animal cambiando su nombre y su edad pero manteniendo su comida favorita.Supongamos que uso
Assert.assertNotEquals()
para afirmar que el original y los nuevos objetos son diferentes.Aquí está la clase Animal con una implementación defectuosa de
createWithNewNameAndAge()
:JUnit 4.11+ (o JUnit 5) tanto como corredor de prueba como herramienta de afirmación
La prueba falla como se esperaba, pero la causa proporcionada al desarrollador realmente no es útil. Simplemente dice que los valores deben ser diferentes y generar el
toString()
resultado invocado en elAnimal
parámetro real :Ok, los objetos no son iguales. ¿Pero dónde está el problema?
¿Qué campo no está correctamente valorado en el método probado? Uno ? Dos? Todos ellos ?
Para descubrirlo, debe profundizar en la
createWithNewNameAndAge()
implementación / usar un depurador, mientras que la API de prueba sería mucho más amigable si nos hiciera la diferencia entre lo que se espera y lo que se obtiene.JUnit 4.11 como corredor de prueba y una API de Matcher de prueba como herramienta de afirmación
Aquí el mismo escenario de prueba pero que usa AssertJ (una excelente API de comparación de pruebas) para hacer la afirmación del
Animal
estado:Por supuesto, la prueba todavía falla, pero esta vez la razón está claramente establecida:
Podemos leer que para los
Animal::getName, Animal::getAge, Animal::getFavoriteFood
valores del Animal devuelto, esperamos tener estos valores:pero hemos tenido estos valores:
Entonces sabemos dónde investigar:
name
yage
no se valoran correctamente. Además, el hecho de especificar elhay
valor en la afirmación deAnimal::getFavoriteFood()
permite también afirmar más finamente el devueltoAnimal
. Queremos que los objetos no sean los mismos para algunas propiedades, pero no necesariamente para todas las propiedades.Definitivamente, usar una API de comparación es mucho más claro y flexible.
fuente
Consistencia de la API de módulo, por qué JUnit no proporcionó
assertNotEquals()
es la misma razón por la que JUnit nunca proporcionó métodos comoassertStringMatchesTheRegex(regex, str)
vs.assertStringDoesntMatchTheRegex(regex, str)
assertStringBeginsWith(prefix, str)
vs.assertStringDoesntBeginWith(prefix, str)
es decir, no hay fin de proporcionar métodos de afirmación específicos para el tipo de cosas que puede desear en su lógica de afirmación.
Es mucho mejor para proporcionar primitivas de prueba componibles como
equalTo(...)
,is(...)
,not(...)
,regex(...)
y dejar que la pieza programador aquellos juntos en lugar de más legibilidad y la cordura.fuente