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

Posted

技术标签:

【中文标题】内容类型未设置 Junit REST POST 测试【英文标题】:Content Type Not Set Junit REST POST test 【发布时间】:2017-03-09 10:46:06 【问题描述】:

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

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);

我的单元测试是:

@RunWith(MockitoJUnitRunner.class)
public class ClassificationControllerTest 

@Mock
private IClassificationService classificationService;

@Before
public void setUp() 
    mockMvc = MockMvcBuilders.standaloneSetup(new ClassificationController(classificationService)).build();


@Test
public void createCategoryTest() throws Exception 
    String jsonTask = String.format("\"id\": \"2\",\"categoryName\": \"Category Name 2\"");
    MvcResult result = mockMvc.perform(post("/category")
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .content(jsonTask))
            .andDo(MockMvcResultHandlers.print())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
            .andExpect(content().string(containsString("\"id\":2")))
            .andExpect(content().string(containsString("\"categoryName\":\"Category Name 2\"")))
            .andExpect(status().isCreated())
            .andReturn();

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

【问题讨论】:

您正在使用MediaType.APPLICATION_JSON_UTF8_VALUE.contentType(APPLICATION_JSON_UTF8)。你不应该用同样的吗? 实际上,它是... one 是我在玩选项时定义的常量。我只是在粘贴代码时忘记将其更改回来。我会在上面更新它。 【参考方案1】:

从断言错误来看,似乎端点没有返回 MediaType.APPLICATION_JSON_UTF8。尝试删除 contentType 检查或调试并查看端点实际返回的内容。再一次,从您看到的错误来看,它似乎根本没有返回任何内容类型。因此,您可能应该检查是否未设置任何内容类型。

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

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

【讨论】:

【参考方案2】:

我发现它只是在那个断言上失败了,因为它是第一个断言,但它只是没有从端点返回任何东西。我正在返回内容类型,因为它正在返回正在插入的对象,因此内容类型是有效的。我最终更改了我的测试,使用 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);

【讨论】:

以上是关于内容类型未设置 Junit REST POST 测试的主要内容,如果未能解决你的问题,请参考以下文章

错误 415 不支持的媒体类型:如果是 JSON,则 POST 未达到 REST,但如果是 XML,则可以

不支持 Spring Rest POST Json RequestBody 内容类型

如何为 Rest Controller 编写 JUnit

WCF 服务 - 使用 json 调用客户端访问 rest 未提供正确的内容类型

Junit MockMvc 使用 URL 中的路径变量执行 POST,返回 404 未找到

云播 URI POST怎么设置