इकाई परीक्षण द्वारा serialVersionUID कवर करने के लिए कैसे

वोट
0

मैं एक विरासत जावा projet कवर करने के लिए इकाई परीक्षण द्वारा जोड़ा जा रहा,

मुझे पता है कि इकाई परीक्षण करने के लिए और इस वर्ग को कवर किया, मैं इकाई परीक्षण bellow जोड़कर ऐसा किया।

public class Thing implements Serializable {

    private static final long serialVersionUID = -1463850548670691860L;

    private String id;
}

उदाहरण के लिए unsing:

वर्ग 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 विस्तार वस्तु आप धारावाहिक deserializing जब तुम serialVersionUID पढ़ सकते हैं:

     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

आपका परीक्षण कवरेज प्रणाली कह रहा है "कोई भी कभी भी अपने इकाई परीक्षण के दौरान इस क्षेत्र तक पहुँचता है"। यही कारण है कि लाल पट्टी साधन है। तो यह दूर जाना आप कोड है कि उस क्षेत्र तक पहुँचता चलाने की आवश्यकता प्राप्त करने के लिए। उपयोग करने के लिए क्षेत्र प्रतिबिंब का उपयोग बढ़ाने के लिए इकाई परीक्षण कवरेज बकवास है। भले ही यह क्षेत्र हरा हो सकता है, यह वास्तव में एक सार्थक तरीके से क्षेत्र का उपयोग नहीं है।

यह करने के लिए सही तरीके से एक तरीका है कि का उपयोग करता है कि क्षेत्र में परीक्षण वर्ग व्यायाम करने के लिए है। serialVersionUID तय करने के लिए करता है, तो बाइट्स कि पढ़ा जा रहा है उद्देश्य यह है कि आप इन्स्तांत की कोशिश कर रहे मेल खाते हैं क्रमबद्धता / अक्रमांकन दौरान प्रयोग किया जाता है।

यहाँ एक सरल उदाहरण है कि कवर क्या आप चाहते हैं। मैं अंत में एक समानता परीक्षण कहा कि है, क्योंकि वास्तव में आप क्या जब आप क्रमांकन / 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);
    }
}

इसलिए उपरोक्त करते हैं, लेकिन अपने स्वयं के वर्ग के साथ फू की जगह और आप कवरेज मिलना चाहिए।

14/01/2020 को 01:17
का स्रोत उपयोगकर्ता

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