Jak pokrýt serialVersionUID by jednotky test

hlasů
0

Já přidávám unit testy, aby pokryla starší java projet,

Vím, jak se jednotky test a pokrýt tuto třídu, udělal jsem to přidáním unit testy níže.

public class Thing implements Serializable {

    private static final long serialVersionUID = -1463850548670691860L;

    private String id;
}

unsing například:

třída ThingTest {

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

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

}

Ale sonar a jacoco výstava serialVersionUID tento údaj není zahrnut. což je v pořádku.

zadejte

Mohl byste mi prosím navrhnout řešení, aby se sonar radost tím, pokrývající tuto oblast.

dík

Položena 14/01/2020 v 00:05
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
-1

Pokud ve svém JUnit rozšíříte ObjectInputString si můžete přečíst serialVersionUID zatímco deserializing objekt, který serializován:

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

Odpovězeno 14/01/2020 v 00:31
zdroj uživatelem

hlasů
0

Systém test pokrytí říká „nikdo přistupuje toto pole během svých unit testů“. Že to, co červený pruh prostředky. Tak, aby si to jít pryč je třeba spustit kód, který přistupuje k této oblasti. Pomocí odrazu přístup pole zvýšit jednotka test pokrytí je nesmysl. I když to může otočit terénu zeleným, není to ve skutečnosti pomocí pole v smysluplným způsobem.

Správný způsob, jak to udělat, je výkon testovací třídu tak, aby využití této oblasti. SerialVersionUID se používá při serializaci / deserializace aby rozhodl, zda jsou byty, které jsou čtena odpovídat na objekt, který se snažíte vytvořit instanci.

Zde je jednoduchý příklad, který zahrnuje to, co chcete. Přidal jsem test rovnosti na konci, protože to je opravdu to, co by mělo být testování, když jste znepokojeni procesu serialization / deserializace.

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

Takže se k výše uvedenému, ale nahrazovat Foo s vaší vlastní třídy a vy byste měli mít pokrytí.

Odpovězeno 14/01/2020 v 01:17
zdroj uživatelem

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