Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring MVC Test Framework - Unsupported Media Type

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\":\"[email protected]\"}";

    ObjectMapper objectMapper = new ObjectMapper();
    ObjectNode userJson = objectMapper.createObjectNode();
    userJson.put("name", "tarun");
    userJson.put("email", "[email protected]");

    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());
}
}
like image 866
vineet Avatar asked Jan 10 '23 16:01

vineet


1 Answers

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.

like image 93
Ryan S Avatar answered Jan 17 '23 23:01

Ryan S