ferlaymat
ferlaymat

Reputation: 11

unable to get the response entity from an api with mockmvc

I have an issue when I try to run my controller's unit test class. I get always a empty body in the response and I don't manage to find why. I put here the code. Maybe someone with an external vision will be able to see the reason.

the controller:

    @ResponseBody
    @PostMapping(path = "/upload", consumes = { MediaType.MULTIPART_FORM_DATA_VALUE }, produces = { MediaType.APPLICATION_JSON_VALUE })
    public ResponseEntity<Object> uploadFile(@RequestParam("file") MultipartFile multipartFileData, @RequestParam(name="jobId", required = false) String jobId) {
        JobStatus result;
        try {
            result = this.fileService.uploadFileChunk(multipartFileData, 1, 1, jobId);
        }catch (ExecutionException|InterruptedException|IOException ex){
            Thread.currentThread().interrupt();
            return new ResponseEntity<>(ex,HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity<>(result,HttpStatus.OK);
    }

the unit test class:


@RunWith(SpringRunner.class)
@SpringBootTest(classes= FileUploadServiceRestController.class)
public class FileUploadServiceControllerTest {

    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext context;

    @MockBean
    private FileUploadServiceImpl fileService;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }

    @Test
    public void testUploadFile()
            throws Exception {
        MockMultipartFile file
                = new MockMultipartFile(
                "file",
                "hello.txt",
                MediaType.TEXT_PLAIN_VALUE,
                "Hello, World!".getBytes()
        );

        JobStatus job = new JobStatus("uuid", ConstantUtil.JOB_STARTED);
        when(fileService.uploadFileChunk(Mockito.any(MultipartFile.class),Mockito.eq(1),Mockito.eq(1),Mockito.isNull())).thenReturn(job);
    mockMvc.perform(MockMvcRequestBuilders.multipart("/file/upload").file(file))
                .andDo(MockMvcResultHandlers.print())
                .andExpect(status().isOk());

    }
}

and the object which will be transfered:

public class JobStatus implements Serializable {

    private static final long serialVersionUID = -4405865740177389860L;
    private String jobId;

    private String status;

    public JobStatus() {
    }

    public JobStatus(String jobId, String status) {
        this.jobId = jobId;
        this.status = status;
    }

    public String getJobId() {
        return jobId;
    }

    public void setJobId(String jobId) {
        this.jobId = jobId;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}

For information, this controller works well when I call it from the client. I can see that the mock is well returned when I put a breakpoint at the end of the controller, but the response body stay empty.

I add here the result of print if it could help:

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /file/upload
       Parameters = {}
          Headers = [Content-Type:"multipart/form-data"]
             Body = <no character encoding set>
    Session Attrs = {}

Handler:
             Type = org.iso.fileservice.controller.FileUploadServiceRestController
           Method = org.iso.fileservice.controller.FileUploadServiceRestController#uploadFile(MultipartFile, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.http.converter.HttpMessageNotWritableException

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

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 500
    Error message = null
          Headers = []
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

thanks, Mathieu

Upvotes: 1

Views: 2114

Answers (1)

Fernando Cuervo
Fernando Cuervo

Reputation: 99

Just ran into this today. I found the answer on Why MockMvc request retrieve empty responseBody while test succeed?

I just added My restController with @Autowired instead of @InjectMocks, after that I started to retrieve the Response Entity instead of a 500 status response

Upvotes: 1

Related Questions