Hvordan dekke serialVersionUID av enheten test

stemmer
0

Jeg legger enhet tester for å dekke en arv java Projet,

Jeg vet hvordan du enheten test og dekker denne klassen, jeg gjorde det ved å legge enheten testen nedenfor.

public class Thing implements Serializable {

    private static final long serialVersionUID = -1463850548670691860L;

    private String id;
}

unsing for eksempel:

class {ThingTest

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

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

}

Men sonar og jacoco showet serialVersionUID som ikke er dekket. som er lyd.

skriv

Kan du foreslå en løsning for å gjøre sonar lykkelig ved å dekke dette feltet.

Takk

Publisert på 14/01/2020 klokken 00:05
kilden bruker
På andre språk...                            


2 svar

stemmer
-1

Hvis du er i din JUnit du utvide ObjectInputString du kan lese serialVersionUID mens deserializing objektet du serialisert:

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

Svarte 14/01/2020 kl. 00:31
kilden bruker

stemmer
0

Din testdekning systemet er å si "ingen noensinne har tilgang til dette området i løpet av din enhet tester". Det er det de røde bar midler. Så for å få det til å gå bort du trenger for å kjøre kode som får tilgang til dette feltet. Ved hjelp av refleksjon for å få tilgang til feltet for å øke enhetstestdekning er tull. Selv om det kan snu feltet grønne, det er faktisk ikke bruker feltet på en meningsfull måte.

Den riktige måten å gjøre dette på er å trene testen klassen på en måte som bruker dette feltet. Den serialVersionUID brukes under serie / deserialization å avgjøre om de bytes som blir lest matche objektet du prøver på å bruke.

Her er et enkelt eksempel som dekker det du ønsker. Jeg har lagt en likestilling test på slutten fordi det er egentlig hva du bør teste når du er bekymret for serie / deserialization prosessen.

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

Så gjør de ovennevnte, men erstatt Foo med din egen klasse, og du bør få dekning.

Svarte 14/01/2020 kl. 01:17
kilden bruker

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