Spring Boot 应用程序在 mockmvc 测试中失败

Posted

技术标签:

【中文标题】Spring Boot 应用程序在 mockmvc 测试中失败【英文标题】:Spring boot application fails on mockmvc test 【发布时间】:2015-07-22 15:21:00 【问题描述】:

我有一个看起来像这样的简单控制器测试

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = CuponzaApiApplication.class)
@WebAppConfiguration
public class UserControllerTest 

private MockMvc mockMvc;

@Autowired
protected WebApplicationContext wac;

@Autowired
UserRepository userRepository;

@Before
public void setUp()
    mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();



@Test
public void createUser() throws Exception
    CuponzaUser user = new CuponzaUser("some@test.com", "firstName", "lastName");
    ObjectWriter jackson = new ObjectMapper().writer().withDefaultPrettyPrinter();

    mockMvc.perform(post("/user/add").content(jackson.writeValueAsString(user)).contentType(MediaType.APPLICATION_JSON))
             .andDo(print())
             .andExpect(status().isOk())
             .andExpect(content().contentType("application/json"));


但是它无法说出以下内容 java.lang.AssertionError:未设置内容类型

这是我的控制器

@RestController
public class UserController 

@Autowired
UserRepository userRepository;

@RequestMapping(value = "/user/add",method = RequestMethod.POST,produces=MediaType.APPLICATION_JSON_VALUE)
public void AddUser(@RequestBody CuponzaUser user, HttpServletResponse response)


    if(user ==null)
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        return;
    else
        user.setCreationDate(new Date());
        user.setLastSeenDate(new Date());
        userRepository.save(user);
        //response.addHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE);
        return;
    


我不想为每个响应手动添加内容类型标头,我认为“生产”注释应该解决这个问题

有什么想法吗?

【问题讨论】:

【参考方案1】:

这往往有点令人困惑 - @RequestMapping 注释的 produces 参数并没有真正修改响应头,它是一种基于用户的 Accept 头来缩小适当处理程序方法的方法@已指定。这样想,@RequestMapping 以及与之相关的所有参数只是一种过滤到适合 Spring MVC 调用的方法的方法。

负责将响应转换为适当媒体类型的MessageConverter 确实插入了响应Content-Type 标头,我认为您的问题是因为您没有在模拟测试中设置Accept 标头- .accept(MediaType.APPLICATION_JSON)

【讨论】:

【参考方案2】:

问题是您没有返回任何东西。您的响应正文为空。

从某种意义上说,没有内容,定义Content-Type 有什么意义?设置Accept 标头也不会让您有任何收获。此外,您也应该能够在单元测试之外重现相同的行为,即这不是您的单元测试/模拟设置的问题。

你可以:

    返回一些内容 考虑返回 204(无内容),如果您真的不想返回任何内容(仍然不会给您 Content-Type 标头,但它会明确表示没有内容) 按照您的问题中注释掉的解决方法手动添加标题

【讨论】:

以上是关于Spring Boot 应用程序在 mockmvc 测试中失败的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot WebFlux 测试未找到 MockMvc

Spring Boot MockMVC 测试不加载 Yaml 文件

在 Spring Boot 1.4 MVC 测试中使用 @WebMvcTest 设置 MockMvc

在 Spring Boot with Slice 中使用 MockMVC 测试静态内容

运行 Spring Boot MockMvc 测试时“找不到返回值的转换器”

Spring Boot MVC 测试 - MockMvc 始终为空