【发布时间】:2017-07-28 01:55:43
【问题描述】:
我有一些使用泛型和 TypeToken 反序列化 JSON 的服务代码。需要该服务来反序列化一个复杂的 TypeToken,以保持其通用参数类型。
这是创建它的代码:
<T extends IPolicy> TypeToken<PolicyWrapper<T>> makePolicyWrapperTypeToken(Class<T> policyClass) {
TypeToken<T> policyTypeToken = TypeToken.of(policyClass);
return new TypeToken<PolicyWrapper<T>>() {}
.where(new TypeParameter<T>() {}, policyTypeToken);
}
TypeToken 似乎无法正常工作,因为我收到了来自 GSON 的类转换错误。
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap
cannot be cast to com.myStuff.IPolicy
看起来我在调试时做得对。 toString() 函数表明它知道它的泛型类型参数:
com.myStuff.PolicyWrapper<com.myStuff.PolicyImpl>
最后,我有一个单元测试。它通过但不测试泛型类型参数。我测试了 TypeToken 的 rawType() 并获得了正确的类,但我不确定如何测试它的泛型。
@Test
public void makePolicyWrapperTypeToken() throws NoSuchMethodException {
TypeToken<?> wrapperToken = makePolicyWrapperTypeToken(PolicyImpl.class);
assertEquals(wrapperToken.getRawType(), PolicyWrapper.class);
//the getContent returns a list but it needs the generic type tested
TypeToken<?> contentToken = wrapperToken.resolveType(PolicyWrapper.class.getMethod("getContent").getGenericReturnType());
assertEquals(contentToken.getRawType(), List.class);
}
【问题讨论】:
标签: java unit-testing generics gson guava