Hoe te dekken serialVersionUID door unit test

stemmen
0

Ik voeg unit tests om een ​​erfenis java projet te dekken,

Ik weet hoe ik unit test en de dekking van deze klasse, ik deed het door toevoeging van de unit test blaten.

public class Thing implements Serializable {

    private static final long serialVersionUID = -1463850548670691860L;

    private String id;
}

unsing bijvoorbeeld:

class ThingTest {

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

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

}

Maar sonar en jacoco tonen serialVersionUID niet bestreken. dat is geluid.

voer

Kunt u wijzen op een oplossing voor sonar gelukkig te maken door het bedekken van dit gebied.

Bedankt

De vraag is gesteld op 13/01/2020 om 22:05
bron van user
In andere talen...                            


2 antwoorden

stemmen
-1

Als in uw JUnit breiden u het ObjectInputString kunt u de serialVersionUID lezen terwijl deserialize het object dat u series:

     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);
    }

antwoordde op 13/01/2020 om 22:31
bron van user

stemmen
0

Uw testdekking systeem zegt "niemand ooit dit gebied toegang tijdens uw unit tests". Dat is wat de rode balk middelen. Dus om het te krijgen om weg te gaan moet je de code die op dat gebied toegang te voeren. Met behulp van reflectie om toegang te krijgen het gebied te verhogen unit test dekking is onzin. Ook al is het gebied groen kan blijken, is het niet echt met behulp van het veld op een zinvolle manier.

De juiste manier om dit te doen is om de test klasse uit te oefenen op een manier die toepassingen die het veld. De serialVersionUID wordt gebruikt tijdens serialisatie / deserialisatie om te beslissen of de bytes die worden gelezen overeen met het object dat je probeert te instantiate.

Hier is een eenvoudig voorbeeld dat covers wat je wilt. Ik voegde een gelijkheid test op het einde, want dat is echt wat je moet testen wanneer u bezorgd bent over de serialisatie / deserialisatie proces.

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);
    }
}

Dus doe het bovenstaande, maar vervang Foo met uw eigen klas en moet je dekking te krijgen.

antwoordde op 13/01/2020 om 23:17
bron van user

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