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());
}
}
我想编写测试序列化和反序列化的单元测试。
ObjectDataOutput
和 ObjectDataInput
的实现要么是包私有的,要么需要从 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);
鉴于我有 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());
}
}
我想编写测试序列化和反序列化的单元测试。
ObjectDataOutput
和 ObjectDataInput
的实现要么是包私有的,要么需要从 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);