Hogyan fedezzük serialVersionUID egység által vizsgált

szavazat
0

Én hozzá egység vizsgálatok, hogy fedezze egy régebbi java projet,

Tudom, hogyan kell egység teszt és fedezze ebben az osztályban, megcsináltam úgy, hogy a készülék teszt ordít.

public class Thing implements Serializable {

    private static final long serialVersionUID = -1463850548670691860L;

    private String id;
}

fogjátok használni például:

class ThingTest {

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

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

}

De szonár és jacoco mutatják serialVersionUID nem terjed. ami hang.

írja

Tudnál olyan megoldás, hogy a szonár boldog lefedésével ezen a területen.

Kösz

A kérdést 14/01/2020 00:05
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
-1

Ha a JUnit bővítheti a ObjectInputString elolvashatja a serialVersionUID míg deserializing a tárgyat, amit sorba:

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

Válaszolt 14/01/2020 00:31
a forrás felhasználó

szavazat
0

A teszt lefedettség rendszer azt mondja: „senki nem fér hozzá során ezen a téren a unit tesztek”. Ez az, amit a piros sáv segítségével. Tehát, hogy ez, hogy menjen el futtatásához szükséges kódot, amely hozzáfér a területen. Segítségével reflexió hozzáférés terén növelni egység teszt lefedettség nonszensz. Bár elképzelhető, hogy kapcsolja be a mező zöld, ez ténylegesen nem használja a pályát értelmes módon.

A jobb módja ennek, hogy gyakorolja a vizsgálati osztály olyan módon, amely az adott területen. A serialVersionUID során alkalmazzák sorszámozás / deserialization eldönteni, hogy a bájtok olvasása egyezik az objektumot, hogy akarsz példányosíthat.

Itt egy egyszerű példa, amely magában foglalja, hogy mit akar. Én hozzá esélyegyenlőségi vizsgálat végén, mert ez tényleg mit kell tesztelni, amikor aggódnak a sorszámozás / deserialization folyamatot.

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

Tehát nem a fenti, de cserélje Foo saját osztályt, és akkor kap lefedettség.

Válaszolt 14/01/2020 01:17
a forrás felhasználó

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