Cómo cubrir serialVersionUID por unidad de prueba

votos
0

Estoy añadiendo pruebas unitarias para cubrir un projet legado java,

Sé como prueba de la unidad y la tapa de esta clase, lo hice mediante la adición de la prueba de la unidad abajo.

public class Thing implements Serializable {

    private static final long serialVersionUID = -1463850548670691860L;

    private String id;
}

unsing por ejemplo:

ThingTest clase {

@Test
void testShouldNotChangeSerialVersionUID() throws NoSuchFieldException {
    final Field serialVersionUID = Thing.class.getDeclaredField(serialVersionUID);
    serialVersionUID.setAccessible(true);

    assertEquals(-1463850548670691860L, getField(serialVersionUID, new Thing()));
}

}

Pero el sonar y jacoco espectáculo serialVersionUID que no están cubiertos. que es el sonido.

introducir

Podría sugerir una solución para hacer feliz a sonar cubriendo este campo.

Gracias

Publicado el 13/01/2020 a las 22:05
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
-1

Si en su JUnit se extiende el ObjectInputString se puede leer el serialVersionUID al deserializar el objeto que serializado:

     private class MyObjectInputStream extends ObjectInputStream {

        public long uid;

        public MyObjectInputStream(InputStream in) throws IOException {
            super(in);
        }

        @Override
        protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
            ObjectStreamClass readClassDescriptor = super.readClassDescriptor(); //To change body of generated methods, choose Tools | Templates.
            uid = readClassDescriptor.getSerialVersionUID();
            return readClassDescriptor;
        }



    }

    @Test
    public void testSomeMethod() throws IOException, ClassNotFoundException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream);
        oos.writeObject(new Thing());
        MyObjectInputStream myObjectInputStream = new MyObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
        myObjectInputStream.readObject();
        assertEquals(-1463850548670691860L, myObjectInputStream.uid);
    }

Respondida el 13/01/2020 a las 22:31
fuente por usuario

votos
0

Su sistema de cobertura de la prueba está diciendo "nadie tiene acceso a este campo durante sus pruebas de unidad". Eso es lo que significa la barra roja. Así que para conseguir que se vaya que necesita para ejecutar código que accede a ese campo. El uso de la reflexión para el acceso al campo para aumentar la cobertura de prueba de unidad no tiene sentido. A pesar de que puede convertir el campo verde, no es en realidad utilizando el campo de una manera significativa.

La forma correcta de hacerlo es ejercer la clase de prueba de manera que los usos ese campo. El serialVersionUID se utiliza durante la serialización / deserialización para decidir si los bytes que se están leyendo coincidir con el objeto de que usted está tratando de instantiate.

He aquí un ejemplo sencillo que cubre lo que quieren. He añadido una prueba de la igualdad en el final, porque eso es realmente lo que debería estar poniendo a prueba cuando se está preocupado por el proceso de serialización / deserialización.

package org.does.not.exist;

import org.junit.jupiter.api.Test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import static org.assertj.core.api.Assertions.assertThat;

class Foo implements Serializable {
     private static final long serialVersionUID = 42L;

    public Foo(String value) {
        this.value = value;
    }

    private String value;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Foo)) return false;

        Foo foo = (Foo) o;

        return value != null ? value.equals(foo.value) : foo.value == null;
    }

    @Override
    public int hashCode() {
        return value != null ? value.hashCode() : 0;
    }
}

class StackoverflowTest {

    @Test
    void test() throws Exception {
        Foo foo = new Foo("a string!");

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(bos);
        out.writeObject(foo);

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream in = new ObjectInputStream(bis);
        Foo copied = (Foo) in.readObject();

        assertThat(foo).isEqualTo(copied);
    }
}

Lo mismo ocurre con lo anterior, pero sustituyendo Foo con su propia clase y usted debe obtener cobertura.

Respondida el 13/01/2020 a las 23:17
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more