内容类型未设置Junit REST POST测试

时间:2016-10-26 22:11:15

标签: rest unit-testing junit spring-boot

我有一个Spring Boot REST应用程序。所有GET请求的单元测试都运行良好;但是,POST请求都返回

define("ace/theme/monokai",["require","exports","module","ace/lib/dom"], function(require, exports, module) {

这是控制器:

java.lang.AssertionError: Content type not set

我的单元测试是:

@RestController
public class ClassificationController {

private IClassificationService classificationService;

@Autowired
public ClassificationController(IClassificationService classificationService) {
    this.classificationService = classificationService;
}

@RequestMapping(value="/category", method = RequestMethod.POST, produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public CategoryDTO createCategory(@RequestBody final CategoryDTO category) throws MctException {
    return classificationService.createCategory(category);
}

我也尝试使用CategoryDTO对象而不是String jsonTask,结果相同。

2 个答案:

答案 0 :(得分:1)

我发现它只是失败了,因为它是第一个,但它只是没有从端点返回任何东西。我正在返回内容类型,因为它返回正在插入的对象,因此内容类型有效。我最后改变了我的测试使用ObjectMapper创建内容JSON,然后我必须在我的域对象上添加一个equals方法....一旦我添加了equals方法,测试就通过了。我没有意识到模拟框架使用了该方法。

@Test
public void createClassTest() throws Exception {
    String jsonInString = objectMapper.writeValueAsString(singleClass);
    when(classificationService.createClass(5, singleClass)).thenReturn(singleClass);
    MvcResult result = mockMvc.perform(post("/class/5")
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .content(jsonInString))
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
            .andExpect(content().string(containsString("\"id\":1")))
            .andExpect(content().string(containsString("\"className\":\"Test Class Name 1\"")))
            .andExpect(status().isCreated())
            .andReturn();
    verify(classificationService).createClass(5, singleClass);
}

答案 1 :(得分:0)

根据断言错误判断,端点似乎没有返回MediaType.APPLICATION_JSON_UTF8。尝试删除contentType检查或调试,并查看端点实际返回的内容。再一次,根据您看到的错误判断,似乎根本没有返回任何内容类型。所以你应该检查没有设置内容类型。

我通常知道我通常测试的POST请求根本不会返回contentType。

毕竟,如果您希望设置内容类型,那么端点实际上可能是在做错了。