GSON在单元测试与部署代码中的行为不同

时间:2020-07-23 10:44:02

标签: java unit-testing 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);
}

此单元测试成功通过,但是在我的生产代码中使用时,由于缺少no-arg构造函数,反序列化失败:

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行为与生产代码相比有何不同吗?

0 个答案:

没有答案
相关问题