Nota: Soy completamente nuevo en el ecosistema Kotlin / JUnit, así que tengan paciencia conmigo si falta algo básico en la pregunta.
Estoy trabajando en un formato de archivo basado en JSON. En las pruebas unitarias/de integración, me gustaría comprobar que la serialización produce exactamente el mismo árbol JSON que algún árbol JSON de referencia. En particular, me gustaría asegurarme de que la serialización maneje sutilezas como nulos implícitos o explícitos correctamente.
Agregué el JSON esperado en forma de un archivo .json sin formato como recurso de prueba, de modo que ahora puedo cargar el contenido de la cadena del JSON esperado. Mi problema es que tengo casos de prueba que requieren algunos árboles JSON bastante profundos/complejos, y no puedo encontrar una buena manera de obtener un resultado de prueba significativo si la comparación falla . Considere, por ejemplo, el caso de que solo un único valor sea incorrecto en algún lugar profundo del árbol JSON. En Rust, estoy usando, por ejemplo , rust-pretty-assertions para resolver estos problemas:
He experimentado con estos enfoques:
Comparación basada en JsonElement . Básicamente uso:
val actualContent: String = ... # from serialization val expectedContent: String = ... # from test fixture val actual = Json.parseToJsonElement(actualContent) val expected = Json.parseToJsonElement(expectedContent) Assertions.assertEquals(actual, expected) Desafortunadamente, si la comparación falla, la salida de la prueba solo contiene una línea org.opentest4j.AssertionFailedError: expected: <{ ... long unformatted JSON ...}> que hace que sea muy difícil detectar el motivo real de la afirmación fallida. Por supuesto, este comportamiento tiene sentido, porque si JsonElement.equals devuelve falso, JUnit no puede hacer nada más que imprimirlo.
Comparación directa de cadenas: por supuesto, esto no es perfecto, porque los árboles JSON pueden ser idénticos incluso si su representación de cadena es diferente. Sin embargo, esperaba que la serialización de ambos me permitiera usar algún tipo de función de diferencia de cadena en JUnit. Hasta ahora, estoy usando Assertions.assertEquals(actual, expected) de JUnit, que desafortunadamente solo imprime las dos cadenas, diciendo que no son iguales, sin una pista de dónde difieren.
¿Hay alguna característica en kotlinx o JUnit que pueda producir una salida de falla de prueba fácil de interpretar?
En caso de que importe: estoy usando JUnit 5, pero estoy abierto a alternativas.
Recomendaría probar JsonUnit . Le permitirá escribir afirmaciones para json con buenos mensajes en caso de falla. Un ejemplo usando la integración AssertJ:
assertThatJson(actual).isEqualTo(expectedJson)... que puede producir el siguiente resultado en un ejemplo similar al tuyo:
Comparing expected: {"lorem":"Hello, Wrold!","ipsum":42,"dolor":{"value":"hey ho!"}} ------------ with actual: {"lorem":"Hello, World!","ipsum":42,"dolor":{"value":"hey"}} Different value found in node "dolor.value", expected: <"hey ho!"> but was: <"hey">. Comparison Failure: Expected :hey ho! Actual :hey Different value found in node "lorem", expected: <"Hello, Wrold!"> but was: <"Hello, World!">. Comparison Failure: Expected :Hello, Wrold! Actual :Hello, World!Agregará otra dependencia a su proyecto, pero es solo para el alcance de la prueba y vale la pena...