Πώς να καλύψει serialVersionUID από μονάδα ελέγχου

ψήφοι
0

Είμαι προσθέτοντας δοκιμές μονάδα για να καλύψει ένα projet κληρονομιά java,

Ξέρω πώς να δοκιμή μονάδα και καλύπτει αυτή την κατηγορία, το έκανα με την προσθήκη της παρακάτω μονάδα ελέγχου.

public class Thing implements Serializable {

    private static final long serialVersionUID = -1463850548670691860L;

    private String id;
}

unsing για παράδειγμα:

class ThingTest {

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

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

}

Όμως, σόναρ και jacoco δείχνουν serialVersionUID ώστε να μην καλύπτονται. η οποία είναι υγιής.

εισάγετε

Θα μπορούσατε σας παρακαλώ να προτείνουμε μια λύση για να κάνει σόναρ ευχαριστημένοι με την κάλυψη αυτόν τον τομέα.

Ευχαριστώ

Δημοσιεύθηκε 14/01/2020 στις 00:05
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
-1

Αν το JUnit σας να επεκτείνετε την ObjectInputString μπορείτε να διαβάσετε την serialVersionUID ενώ deserializing το αντικείμενο που συνέχειες:

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

Απαντήθηκε 14/01/2020 στις 00:31
πηγή χρήστη

ψήφοι
0

Το σύστημα κάλυψης δοκιμής λέει «κανείς δεν έχει πρόσβαση σε όλο το πεδίο αυτό κατά τη διάρκεια των δοκιμών μονάδα σας». Αυτό είναι ό, τι το κόκκινο μέσα bar. Έτσι για να το πάρει για να πάει μακριά θα πρέπει να εκτελέσετε κώδικα που έχει πρόσβαση αυτό το πεδίο. Χρησιμοποιώντας τον προβληματισμό για την πρόσβαση στο χώρο για να αυξηθεί η κάλυψη δοκιμή μονάδα είναι ανοησίες. Ακόμα κι αν μπορεί να μετατρέψει το πράσινο πεδίο, δεν είναι στην πραγματικότητα χρησιμοποιώντας το πεδίο με ουσιαστικό τρόπο.

Ο σωστός τρόπος για να γίνει αυτό είναι να ασκήσει την τάξη τεστ με τέτοιο τρόπο ώστε χρήσεις ότι το πεδίο. Η serialVersionUID χρησιμοποιείται κατά τη διάρκεια της σειριακής / deserialization να αποφασίσει αν τα bytes που διαβάζεται ταιριάζει με το αντικείμενο που προσπαθείτε να υπόσταση.

Εδώ είναι ένα απλό παράδειγμα που καλύπτει ό, τι θέλετε. Πρόσθεσα ένα τεστ ισότητα στο τέλος, γιατί αυτό είναι πραγματικά αυτό που πρέπει να τον έλεγχο όταν ανησυχούν για τη διαδικασία σειριοποίησης / deserialization.

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

Έτσι κάνετε το παραπάνω, αλλά αντικαταστήστε Foo με τη δική σας κατηγορία και θα πρέπει να πάρει την κάλυψη.

Απαντήθηκε 14/01/2020 στις 01:17
πηγή χρήστη

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