Birim testi ile serialVersionUID kapsayacak şekilde nasıl

oy
0

Ben eski bir java projet kapsayacak şekilde birim testleri ekliyorum,

Ben birim test feryat ekleyerek yaptım, nasıl birim testi bilmek ve bu sınıfı kapsar.

public class Thing implements Serializable {

    private static final long serialVersionUID = -1463850548670691860L;

    private String id;
}

örneğin unsing:

Sınıf ThingTest {

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

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

}

Ama sonar ve jacoco gösterisi olarak kapsamadığı serialVersionUID. ki sesidir.

Burada

Bu Field kapsayarak sonar mutlu etmek için bir çözüm önermek misiniz.

Teşekkürler

Oluştur 14/01/2020 saat 00:05
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
-1

Eğer JUnit size tefrika nesneyi deserializing yaparken serialVersionUID okuyabilir ObjectInputString uzanırlar:

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

Cevap 14/01/2020 saat 00:31
kaynak kullanıcı

oy
0

Testiniz kapsama sistemi "kimsenin senin birim testleri sırasında bu alanı erişir" söylüyor. Yani neyi Kırmızı çubuk araçları bulunuyor. Yani bu alanı erişen kod çalıştırmasına gerek gitmesini olsun. erişim alanını yansıma kullanarak birim test kapsama saçmalıktır artırmak. saha yeşillenirsin olsa da, aslında anlamlı bir şekilde alanını kullanarak değil.

Bunu yapmanın doğru yolu bir şekilde that use o saha test sınıfını kullanmak demek. serialVersionUID okuma ediliyor bayt başlatmanızı çalıştığınızı nesneyle eşleşecek karar vermek için seri / seri kaldırma sırasında kullanılır.

İşte kapakları istediğiniz bu basit bir örnek. Çünkü o sonunda eşitlik testi eklendi gerçekten sen seri / seri kaldırma süreci hakkında endişe ederken, test edilmesi gereken.

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

Yani yukarıdaki yapmak, ama kendi sınıfı ile Foo yerine ve kapsama almalısınız.

Cevap 14/01/2020 saat 01:17
kaynak kullanıcı

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