Spring MVC测试框架-不支持的媒体类型



我正在使用spring-test-mvc框架为控制器编写一个测试。我正在尝试测试一个post请求,它生成了JSON。实际代码正在运行,但测试失败。

我得到的错误状态应为200,但得到的是415,这意味着不支持的媒体类型。我检查了网上的所有例子,似乎我的实现是正确的。请帮帮我。

MyTestcase TestStringPost((已成功运行,但TestJSONPost失败。

我正在使用Spring 3.2

我的控制器

@Controller
public class HomeController {

@RequestMapping(value = "/v1/checkstringvalue", method = RequestMethod.POST, produces = "application/json")
public @ResponseBody void testStringPost(@RequestBody String value) {
    logger.info("Welcome home! The client locale is {}.");
}
@RequestMapping(value = "/v1/checkjsonvalue", method = RequestMethod.POST, produces = "application/json")
public @ResponseBody String testJSONPost(@RequestBody Map<String, String> userMap) {
    System.out.println("Inside test jsonpost controller");
    logger.info("Welcome home! The client locale is {}.");
    return "Success";
 }
}

这是我的测试控制器

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class HomeControllerTest {

@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
private static final String PROVIDER_A = "PROVIDER_A";
public static final MediaType APPLICATION_JSON_UTF8 = new MediaType(
        MediaType.APPLICATION_JSON.getType(),
        MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
@Configuration
public static class TestConfiguration {
    @Bean
    public HomeController simpleController() {
        return new HomeController();
    }
}
@Before
public void setup() {
    mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
@Test
public void testStringPost() throws Exception {
    final String createJson = "hello";
    ResultActions resultActions = mockMvc.perform(post(
            "/v1/checkstringvalue").contentType(MediaType.TEXT_PLAIN)
            .content(createJson));
    resultActions.andDo(print());
    resultActions.andExpect(status().isOk());
}
@Test
public void testjsonPost() throws Exception {
    System.out.println("Inside testjsonpost");
    final String createJson = "{"name":"hello","email":"hello@example.com"}";
    ObjectMapper objectMapper = new ObjectMapper();
    ObjectNode userJson = objectMapper.createObjectNode();
    userJson.put("name", "tarun");
    userJson.put("email", "tarun@gmail.com");
    ResultActions resultActions = mockMvc
            .perform(post("/v1/checkjsonvalue")
                    .contentType(APPLICATION_JSON_UTF8)
                    .accept(APPLICATION_JSON_UTF8)
                    .content(objectMapper.writeValueAsBytes(userJson)));
    resultActions.andDo(print());
    resultActions.andExpect(status().isOk());
}
}

好的,所以有

perform(post("/myapi").contentType(MediaType.APPLICATION_JSON).content("{"mykey":"myvalue"}"))   

重要。

但也要检查你的控制器:如果它缺少这些注释中的任何一个,它都不会工作:

@EnableWebMvc
@Controller
public class MyController {
    @RequestMapping(value="/myapi", method=RequestMethod.POST)
    public void postOnApi(@RequestBody MyWidget myWidget) {
    }
}

@EnableWebMvc@Controller和@RequestBody都需要(在我的实验中(来删除415状态代码错误。

您的测试代码:

ResultActions resultActions = mockMvc
            .perform(post("/v1/checkjsonvalue")
                    .contentType(APPLICATION_JSON_UTF8)
                    .accept(APPLICATION_JSON_UTF8)
                    .content(objectMapper.writeValueAsBytes(userJson)));

似乎添加了contentType()标头,但您的源代码在@RequestMapping 中没有consumes属性

@RequestMapping(value = "/v1/checkjsonvalue", method = RequestMethod.POST, produces = "application/json")
public @ResponseBody String testJSONPost(@RequestBody Map<String, String> userMap) {
    System.out.println("Inside test jsonpost controller");
    logger.info("Welcome home! The client locale is {}.");
    return "Success";
 }

我认为,如果您在测试用例中去掉contentType((,或者在源代码中添加consumps,那么它可能会起作用。

如果您在springmvc项目中使用基于xml的配置,请确保在控制器上放置了@EnableWebMvc

最新更新