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

时间:2015-05-11 23:24:22

标签: spring-mvc spring-boot spring-test

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

@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;
    }

}

我不想为每个响应手动添加内容类型标题,我认为“生成”注释应该处理这个

任何想法?

2 个答案:

答案 0 :(得分:3)

这往往有点令人困惑 - produces注释的@RequestMapping参数并没有真正修改响应头,这是一种根据{{1}缩小相应处理程序方法的方法用户指定的标头。可以这样想,Accept和与之关联的所有参数只是一种过滤到适合Spring MVC调用的方法的方法。

负责将响应转换为相应媒体类型的@RequestMapping会插入响应MessageConverter标题,我认为您的问题是因为您没有设置Content-Type模拟测试中的标题 - Accept

答案 1 :(得分:1)

问题在于你没有返回任何东西。你的回复正文是空的。

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

你可以:

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