如何在mockmvc中将模拟对象作为JSON发送

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)


Ser*_*sta 6

即使有可能,将模拟对象提交给JSON转换器也会假设一个单元测试专用于该操作:模拟对象可能有很多属性和方法,远远超出了真正的类,序列化可能会导致一个非常奇怪的结果.

恕我直言,因为它是一个单元测试,你应该手工编写json序列化字符串.如果你需要控制Gson如何进行序列化,你可以做其他测试