当前位置: 首页 > 知识库问答 >
问题:

使用Spring MockMVC测试Spring的@RequestBody

段恩
2023-03-14
@Test
public void testInsertObject() throws Exception { 

    String url = BASE_URL + "/object";

    ObjectBean anObject = new ObjectBean();
    anObject.setObjectId("33");
    anObject.setUserId("4268321");
    //... more

    Gson gson = new Gson();
    String json = gson.toJson(anObject);

    MvcResult result = this.mockMvc.perform(
            post(url)
            .contentType(MediaType.APPLICATION_JSON)
            .content(json))
            .andExpect(status().isOk())
            .andReturn();
}
@ResponseBody
@RequestMapping(    consumes="application/json",
                    produces="application/json",
                    method=RequestMethod.POST,
                    value="/object")
public ObjectResponse insertObject(@RequestBody ObjectBean bean){

    this.photonetService.insertObject(bean);

    ObjectResponse response = new ObjectResponse();
    response.setObject(bean);

    return response;
}
{
   "objectId":"33",
   "userId":"4268321",
   //... many more
}

ObjectBean类

public class ObjectBean {

private String objectId;
private String userId;
//... many more

public String getObjectId() {
    return objectId;
}

public void setObjectId(String objectId) {
    this.objectId = objectId;
}

public String getUserId() {
    return userId;
}

public void setUserId(String userId) {
    this.userId = userId;
}
//... many more
}

所以我的问题是:我如何使用Spring mockMVC测试这个方法?

共有1个答案

章玮
2023-03-14

用这个

public static final MediaType APPLICATION_JSON_UTF8 = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));

@Test
public void testInsertObject() throws Exception { 
    String url = BASE_URL + "/object";
    ObjectBean anObject = new ObjectBean();
    anObject.setObjectId("33");
    anObject.setUserId("4268321");
    //... more
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
    ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter();
    String requestJson=ow.writeValueAsString(anObject );

    mockMvc.perform(post(url).contentType(APPLICATION_JSON_UTF8)
        .content(requestJson))
        .andExpect(status().isOk());
}

正如注释中所描述的,这是因为对象被转换为json并作为请求体传递。此外,contentType被定义为Json(APPLICATION_JSON_UTF8)。

有关HTTP请求正文结构的更多信息

 类似资料:
  • 我试图使用spring和mockito对rest控制器进行单元测试。这是我的主控制器方法。 这是我的JUnit测试: 在输出响应中,测试失败,因为它得到404错误,但它预期成功代码为200。我相信我已经正确设置了独立配置,我会做错什么。为什么URI没有正确映射到方法?请注意,对于来自应用程序前端的相同URI,它工作正常。以下是我使用Postman工具为chrome测试的正确200响应的完整URI:

  • 我们正在慢慢地将一些项目从使用遗留的RestTemplate类迁移到新的Spring 5 WebClient。作为其中的一部分,我们有一些现有的测试类,这些测试类使用Mockito来验证给定的方法是否会使用模板对endpointX进行GET/POST/whatever。 考虑到WebClient的流畅界面,同样的模拟方法实际上并不实用。我花了一些时间使用WireMock,这很好,但不幸的是,似乎有

  • 我有一个依赖Spring批处理JobLauncher的类。 我想使用这个JobLauncher的异步版本,所以我创建了一个配置: 我不得不使用,否则当应用程序运行时,其他一些同步JobLauncher会被选中。 现在,在我的测试中,我想使用同步版本来验证作业执行的结果。因此,我在配置中定义了同步bean: 然而,当我的测试运行时。。它总是使用异步版本,我的结果不正确。 是否有一种方法可以在我的测试

  • 我有以下简单的控制器来捕捉任何意外的异常: 我正在尝试使用Spring MVC测试框架编写一个集成测试。这是我目前所掌握的:

  • 问题内容: 我正在使用TestNG使用AbstractTransactionalTestNGSpringContextTests作为基类来测试持久性Spring模块(JPA + Hibernate)。@ Autowired,@ TransactionConfiguration,@ Transactional的所有重要部分都可以正常工作。 当我尝试在带有threadPoolSize = x,invo