Hazelcast 的 DataSerializable writeData 和 readData 的序列化单元测试

Serialization unit test for Hazelcast's DataSerializable writeData and readData

鉴于我有 Audit class:

public class Audit implements DataSerializable {

    private String createdBy = "me";
    private LocalDateTime createdTimestamp = LocalDateTime.now();

    private String modifiedBy;
    private LocalDateTime modifiedTimestamp;

    @Override
    public void writeData(ObjectDataOutput out) throws IOException {
        out.writeUTF(getCreatedBy());
        out.writeObject(getCreatedTimestamp());

        out.writeUTF(getModifiedBy());
        out.writeObject(getModifiedTimestamp());
    }

    @Override
    public void readData(ObjectDataInput in) throws IOException {
        setCreatedBy(in.readUTF());
        setCreatedTimestamp(in.readObject());

        setModifiedBy(in.readUTF());
        setModifiedTimestamp(in.readObject());
    }

}

我想编写测试序列化和反序列化的单元测试。

ObjectDataOutputObjectDataInput 的实现要么是包私有的,要么需要从 Hazelcast API.

提供组件

如何创建这样的测试?

毕竟,创建这样的测试是可能的。 我缺少可以创建 SerializationService

DefaultSerializationServiceBuilder

在Groovy中编写的整个测试是:

import static org.apache.commons.lang3.builder.EqualsBuilder.reflectionEquals

import java.time.LocalDateTime

import com.hazelcast.internal.serialization.impl.DefaultSerializationServiceBuilder
import com.hazelcast.internal.serialization.impl.ObjectDataInputStream
import com.hazelcast.internal.serialization.impl.ObjectDataOutputStream
import com.hazelcast.spi.serialization.SerializationService
import org.junit.Test

class AuditTest {

    @Test
    void "serialize and deserialize Audit"() {
        def toSerialize = new Audit(createdBy: "me",
                createdTimestamp: LocalDateTime.now(),
                modifiedBy: "you",
                modifiedTimestamp: LocalDateTime.now(),
        )
        SerializationService serializationService = new DefaultSerializationServiceBuilder().build()

        def outputStream = new ByteArrayOutputStream()
        def dataOutput = new ObjectDataOutputStream(outputStream, serializationService)
        toSerialize.writeData(dataOutput)

        def inputStream = new ByteArrayInputStream(outputStream.toByteArray())
        def dataInput = new ObjectDataInputStream(inputStream, serializationService)

        def toDeserialize = new Audited()
        toDeserialize.readData(dataInput)

        assert reflectionEquals(toDeserialize, toSerialize)
    }
}

您可以使用 SerializationService 克隆对象并测试相等性

SerializationService serializationService = new DefaultSerializationServiceBuilder().build();

Audit expected = new Audit(...);
Audit actual = serializationService.toObject(serializationService.toData(expected);
assertEquals(expected, actual);