Sou*_*abh 14 java json unit-testing mockito gson
我想通过内容类型为JSON的MockMvc在控制器中发送一个模拟对象.但是当我尝试序列化模拟时,错误是:
java.lang.UnsupportedOperationException: Expecting parameterized type, got interface org.mockito.internal.MockitoInvocationHandler.
Are you missing the use of TypeToken idiom?
Run Code Online (Sandbox Code Playgroud)
我的代码如下:
@Test
public void testSomething(){
String xyz = "";
Integer i = 10;
SomeClass inst = mock(SomeClass.class, withSettings().serializable());
when(inst.getProperty1()).then(xyz);
when(inst.getProperty2()).then(i);
Gson gson = new Gson();
String json = gson.toJson(inst); // this is creating error
this.mockmvc.perform(put("/someUrl/").contentType(MediaType.JSON).content(json)).andExpect(status().isOk());
}
Run Code Online (Sandbox Code Playgroud)
有人能告诉我我错过了什么吗?
mat*_*sev 26
我建议你创建一个你的存根,SomeClass它返回getProperty1()和getProperty2()方法的已知值.根据SomeClass实现的方式,您可以new直接创建它的实例,子类和覆盖某些方法,如果是接口则创建匿名内部类等.
@Test
public void testSomething(){
String xyz = "";
Integer i = 10;
// alt 1:
SomeClass stub = new SomeClass(xyz, i);
// alt 2:
SomeClass stub = new StubSomeClass(xyz, i); // StubSomeClass extends SomeClass
// alt 3:
SomeClass stub = new SomeClass() {
@Override
String getProperty1() {
return xyz;
}
@Override
Integer getProperty2() {
return i;
}
}
Gson gson = new Gson();
String json = gson.toJson(stub);
this.mockmvc.perform(put("/someUrl/")
.contentType(MediaType.APPLICATION_JSON).content(json))
.andExpect(status().isOk());
}
Run Code Online (Sandbox Code Playgroud)
即使有可能,将模拟对象提交给JSON转换器也会假设一个单元测试专用于该操作:模拟对象可能有很多属性和方法,远远超出了真正的类,序列化可能会导致一个非常奇怪的结果.
恕我直言,因为它是一个单元测试,你应该手工编写json序列化字符串.如果你需要控制Gson如何进行序列化,你可以做其他测试