Spring Boot integration test responding with empty body - MockMvc

adbar :

I've seen similar questions to this, but I've yet to find a solution that works for me, so i'm posting it with hopefully enough details to resolve..

So I have the following class:

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestController {

    @Mock
    private Controller controller;

    private MockMvc mockMvc;

    @InjectMocks
    private SearchService service;

    @Before
    public void setUp(){
        MockitoAnnotations.initMocks(this);
        this.mockMvc = MockMvcBuilders.standaloneSetup(controller).setControllerAdvice(new GlobalExceptionHandler()).build();
    }

    @Test
    public void getSearchResults() throws Exception{
        this.mockMvc.perform(post("/something/search").header("header1","1").header("header2","2")
            .content("MY VALID JSON REQUEST HERE")
            .contentType(MediaType.APPLICATION_JSON)).andDo(print());
    }
}

The above code prints:

MockHttpServletRequest:
    HTTP Method = POST
    Request URI = /something/search
     Parameters = {}
      Headers = {Content-Type=[application/json], header1=[1], header2=[2]}

Handler:
    Type = com.company.controller.Controller
    Method = public org.springframework.http.ResponseEntity<com.company.SearchResponse> com.company.controller.Controller.getSearchResults(com.company.SearchRequest,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String) throws java.io.IOException

Async:
    Async started = false
     Async result = null

Resolved Exception:
    Type = null

ModelAndView:
    View name = null
    View = null
    Model = null

FlashMap:
    Attributes = null

MockHttpServletResponse:
            Status = 200
     Error Message = null
           Headers = {}
      Content type = null
              Body = 
     Forwarded URL = null
    Redirected URL = null
           Cookies = []

Even if the data i'm trying to search is not available in my local elastic server (which it is), it should return the body with "{}" not just empty. So i'm a little baffled as to why it's making the connection and returning status 200.

Here's my controller class:

@CrossOrigin
@RestController
@RequestMapping(value = "/something")
@Api("search")
@Path("/something")
@Produces({"application/json"})
@Consumes({"application/json"})
public class Controller {

    @Autowired
    private SearchService searchService;

    @POST
    @PATH("/search")
    @Consumes({"application/json"})
    @Produces({"application/json"})
    @RequestMapping(value = "/search", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<SearchResponse> getSearchResults(
        @ApiParam(value = "json string with required data", required = true) @Valid @RequestBody SearchRequest request,
        @RequestHeader(required = true) @ApiParam(value = "header1", required = true) @HeaderParam("header1") String header1,
        @RequestHeader(required = true) @ApiParam(value = "header2", required = true) @HeaderParam("header2") String header2
    ) throws IOException {
        //some logic
        return new ResponseEntity(Object, HttpStatus.OK);
    }

Also, if I give some improper values in the request (still proper json), I will receive the valid error responses.. A little peculiar.

Thanks for anyone who helps!!! :/

Vijendra Kumar Kulhade :

Try with this test. This test is as per spring boot documentation.

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
public class ControllerTest {


    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private SearchService service;

    @Before
    public void setUp(){
        when(service.someMethod(any()))
                .thenReturn(SomeResponse);
    }

    @Test
    public void getSearchResults() throws Exception{
        this.mockMvc.perform(post("/something/search").header("header1","1").header("header2","2")
                .content("MY VALID JSON REQUEST HERE")
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andDo(mvcResult -> {
                    //Verrify Response here
                });
    }
}

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=443858&siteId=1