类似testcase Bug_for_generic_huansi.java
但在第二层继承的时候嵌套了List
@RunWith(JUnit4.class)
public class GenericObjectJsonParseTest {
@Test
public void parseObject() {
assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
new TypeReference<BaseGenericType<List<String>>>(){}).data.get(1));
assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
new TypeReference<ExtendGenericType<String>>(){}).data.get(1));
assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"],\"a\":\"a\"}",
SimpleGenericObject.class).data.get(1));
}
static class BaseGenericType<T> {
public T data;
}
static class ExtendGenericType<T> extends BaseGenericType<List<T>> {
}
static class SimpleGenericObject extends ExtendGenericType<String> {
}
}
在解析SimpleGenericObject类的时候单元测试失败:
java.lang.ClassCastException: java.lang.String cannot be cast to java.util.List
最后一个断言里多了一个a属性
@kimmking 呃是测试的时候多加的,贴上来忘删了。但即使有多余的字段也不应会影响不是吗?
@RunWith(JUnit4.class)
public class GenericObjectJsonParseTest {
@Test
public void parseObject1() {
assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
new TypeReference<BaseGenericType<List<String>>>() {
}).data.get(1));
}
@Test
public void parseObject2() {
assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
new TypeReference<ExtendGenericType<String>>() {
}).data.get(1));
}
@Test
public void parseObject3() {
assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
SimpleGenericObject.class).data.get(1));
}
@Test
public void parseObject4() {
assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
SimpleGenericObjectWithJSONCreator.class).data.get(1));
}
@Test
public void parseObject5() {
assertEquals("2", JSON.parseObject("{\"data\":[\"1\",\"2\",\"3\"]}",
SimpleGenericObjectWithJSONCreatorFactory.class).data.get(1));
}
static class BaseGenericType<T> {
public T data;
}
static class ExtendGenericType<T> extends BaseGenericType<List<T>> {
}
static class SimpleGenericObject extends ExtendGenericType<String> {
}
static class SimpleGenericObjectWithJSONCreator extends ExtendGenericType<String> {
@JSONCreator
public SimpleGenericObjectWithJSONCreator(
@JSONField(name = "data") List<String> data) {
this.data = data;
}
}
static class SimpleGenericObjectWithJSONCreatorFactory extends ExtendGenericType<String> {
@JSONCreator
public static SimpleGenericObjectWithJSONCreatorFactory create(
@JSONField(name = "data") List<String> data) {
SimpleGenericObjectWithJSONCreatorFactory o
= new SimpleGenericObjectWithJSONCreatorFactory();
o.data = data;
return o;
}
}
}
我更新了一下单元测试,parseObject3() 和 parseObject5() 是验证不通过的:java.lang.ClassCastException: java.lang.String cannot be cast to java.util.List
类型计算错误了。。。