【问题标题】:How can I pass a object using MockMvc as a RequestBody?如何使用 MockMvc 作为 RequestBody 传递对象?
【发布时间】:2018-07-04 23:05:24
【问题描述】:

所以这是我在代码中所面临的场景和问题

// the call that I am making in my test, please note that myService is a Mocked object
Foo foo = new Foo();
when(myService.postFoo(foo)).thenReturn(true); 
mockMvc.perform(post("/myEndpoint")
    .contentType(APPLICATION_JSON_UTF8)
    .content(toJsonString(foo))
    .andExpect(status().isAccepted());


// this is the controller method that get's called
@PostMapping("/myEndpoint") 
@ResponseStatus(code = HttpStatus.ACCEPTED) 
public String postFoo(@RequestBody Foo foo) { 
    if (myService.postFoo(foo)) {
         return "YAY"; 
    } 
    return "" + 0 / 0; 
}

我面临的问题是 mockMvc 的 post 传入的 foo 是 Foo 的一个新实例,所以 myService.postFoo(foo) 的 if 语句失败。我假设引擎使用我的 foo 对象的 jsonString 来创建一个新的,它在字段方面是相同的,但是是一个不同的对象,因此使“if”语句失败。

我该如何解决这个问题?

【问题讨论】:

    标签: spring spring-mvc spring-boot mockito mockmvc


    【解决方案1】:

    在你的模拟中使用 any(Foo.class),而不是你的 if 应该匹配。

    http://static.javadoc.io/org.mockito/mockito-core/2.19.0/org/mockito/ArgumentMatchers.html#any-java.lang.Class-

    【讨论】:

    • 哦,顺便说一句,有没有办法完全避免直接创建 Foo 对象,而无需依赖注入?或者由于 mockMvc 的 post 方法,我仍然需要这个。因为如果我做类似 mockMvc.perform(post("").contentType(APPLICATION_JSON_UTF8).content(toJsonString(any(Foo.class))) 的事情,那么就会有反射问题
    猜你喜欢
    • 2016-12-15
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多