java - GSON 在单元测试与部署代码中的行为不同
问题描述
我正在尝试将 GSON 集成到现有项目中,以序列化和反序列化主要由 POJO 组成的预先存在的复杂数据结构。我编写了一个 JUnit 测试来验证这是否成功,如下所示:
@Test
public void testJsonSerialization() throws Exception {
Gson gson = new GsonBuilder().create();
MyObject myObject = generateMyObject();
//Convert to JSON
String json = gson.toJson(myObject);
//Convert to MyObject
MyObject newMyObject = gson.fromJson(json, MyObject.class);
//Compare
assertEquals(myObject, newMyObject);
}
此单元测试成功通过,但在我的生产代码中使用时,由于缺少无参数构造函数,反序列化失败:
public void onHttpPostRequest(HttpRequest request){
Gson gson = new GsonBuilder().create();
try{
validateHttpPostRequest(request);
MyObject myObject = gson.fromJson(request.getContentAsString(), MyObject.class);
//continue processing request
} catch(Exception e) {
logger.warn("Failed to parse incoming Request", e);
}
}
导致以下异常:
Failed to parse incoming Request
java.lang.RuntimeException: Unable to invoke no-args constructor for class com.example.MyChildObject. Registering an InstanceCreator with Gson for this type may fix this problem.
at com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:228)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:212)
at com.google.gson.Gson.fromJson(Gson.java:932)
at com.google.gson.Gson.fromJson(Gson.java:1003)
at com.google.gson.internal.bind.TreeTypeAdapter$GsonContextImpl.deserialize(TreeTypeAdapter.java:162)
at com.example.Message$JsonAdapter.deserialize(Message.java:230)
at com.example.Message$JsonAdapter.deserialize(Message.java:188)
at com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:69)
at com.google.gson.TypeAdapter$1.read(TypeAdapter.java:199)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
at com.google.gson.Gson.fromJson(Gson.java:932)
at com.google.gson.Gson.fromJson(Gson.java:897)
at com.google.gson.Gson.fromJson(Gson.java:846)
at com.google.gson.Gson.fromJson(Gson.java:817)
我对解决这个问题绝对没有问题,但由于单元测试不具有代表性,我们不能 100% 确定我们没有错过复杂数据类型中的任何类。
与生产代码相比,单元测试中的 GSON 行为是否有任何不同?
解决方案
推荐阅读
- javascript - 如何过滤数组内的数组值?
- java - 间歇性 Zookeeper 超时问题仅发生在 MAC 中,同时运行所有集成测试
- javascript - jquery检查每个循环是否被破坏
- python - Python从名称字符串的末尾删除中间首字母
- android - 活动中的旧意图从通知开始
- angular - 如何使用 Observable 中的数据更新我的 Angular Table 数据源
- python - 国际开发协会 Python + Qt。如何将我自己的选项卡插入 IDA 主选项卡小部件?
- java - tls 正在使用自签名证书而不是真实证书的 mosquitto 经纪人
- vba - 将文本从一个词范围复制到另一个词的困难 - 返回错误代码“此命令不可用”
- android - 注册并使用注册号登录