es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Assertj no funciona con Jackson JsonNode.

Estoy utilizando assertj y la combinación de JsonNode de Jackson. Hasta ahora he estado usando Assertions.assertThat(objectNode0).isEqualTo(objectNode1); y todo funciona bien.

Ahora, necesito ignorar algunos campos en la comparación, y el método que intenté usar es usingRecursiveComparison, pero no alerta cuando los objetos son diferentes.
¿Hay alguna manera de solucionar esto? Aquí está mi código de ejemplo:

public class Main {

public static void main(String[] args) {
    ObjectMapper om = new ObjectMapper();

    try {
        JsonNode objectNode0 = om.readTree("{\"someNotImportantValue\":1,\"importantValue\":\"10\"}");
        JsonNode objectNode1 = om.readTree("{\"someNotImportantValue\":15,\"importantValue\":\"1\"}");

        boolean equals = objectNode0.equals(objectNode1);
        System.out.println(equals); // imprime false

        //Esto funciona, pero no permite ignorar ningún campo
        //Assertions.assertThat(objectNode0).isEqualTo(objectNode1);

        //Esperaríamos que esta sentencia falle, ya que importantValue sigue siendo diferente, pero no lo hace.
        Assertions.assertThat(objectNode0).usingRecursiveComparison().ignoringFields("someNotImportantValue").isEqualTo(objectNode1);

    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es posible superar este problema utilizando la opción “ignoringFieldsMatchingPaths” en lugar de “ignoringFields”. Esta opción toma una matriz de cadenas de expresiones regulares que coinciden con los campos que se deben ignorar. Aquí hay un código de ejemplo actualizado que debería funcionar:

    public class Main {
    
        public static void main(String[] args) {
            ObjectMapper om = new ObjectMapper();
    
            try {
                JsonNode objectNode0 = om.readTree("{\"someNotImportantValue\":1,\"importantValue\":\"10\"}");
                JsonNode objectNode1 = om.readTree("{\"someNotImportantValue\":15,\"importantValue\":\"1\"}");
    
                boolean equals = objectNode0.equals(objectNode1);
                System.out.println(equals); // imprime false
    
                Assertions.assertThat(objectNode0)
                          .usingRecursiveComparison()
                          .ignoringFieldsMatchingPaths(".*someNotImportantValue.*")  // ignora los campos que contienen "someNotImportantValue"
                          .isEqualTo(objectNode1);
    
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
    }
    

    En este ejemplo, la opción “ignoringFieldsMatchingPaths” se utiliza para ignorar cualquier campo que contenga “someNotImportantValue”. Esto debería ignorar correctamente el campo en ambos JsonNodes y comparar el campo importantValue.

Comments are closed.