I am writing a test for controller using spring test mvc framework. I am trying to test a post request and it produces JSON. The actual code is running but test is failing.
I an getting the error Status expected 200 but getting 415 which means unsupported media type. i check all examples on net and it seems my implementation is correct. please help me out.
MyTestcase TestStringPost() is running successfully but TestJSONPost is failing.
I am using Spring 3.2
My Controller
@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";
}
}
This is my Test Controller
@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());
}
}
Ok, so having the
perform(post("/myapi").contentType(MediaType.APPLICATION_JSON).content("{\"mykey\":\"myvalue\"}"))
is important.
BUT also check your controller: if it is missing any of these annotations, it won't work:
@EnableWebMvc
@Controller
public class MyController {
@RequestMapping(value="/myapi", method=RequestMethod.POST)
public void postOnApi(@RequestBody MyWidget myWidget) {
}
}
The @EnableWebMvc @Controller and @RequestBody are all needed (in my experimenting) to remove the 415 status code error.
Your test code:
ResultActions resultActions = mockMvc
.perform(post("/v1/checkjsonvalue")
.contentType(APPLICATION_JSON_UTF8)
.accept(APPLICATION_JSON_UTF8)
.content(objectMapper.writeValueAsBytes(userJson)));
Seems to add the contentType()
header, but your source code does not have a consumes
attribute in the @RequestMapping
@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";
}
I think that if you take out the contentType() in your test case or add a consumes in the source code then it might work.
如果您在 spring mvc 项目中使用基于 xml 的配置,请确保已将@EnableWebMvc放在控制器上。
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.