Home > Back-end >  Mockmvc returns empty response body even if response status is 200
Mockmvc returns empty response body even if response status is 200

Time:04-29

I am trying to learn Junit and I ended up in a situation where my testcase returns 200 status code but returns null response Body. Its just a simple save operation using JPA repo and I have tried many online solutions but none worked for me.

Testclass :

 @RunWith(SpringRunner.class)
 @SpringBootTest
 @AutoConfigureMockMvc
 class CarManufacturingSystemApplicationTests {

   @Autowired
   private MockMvc mockMvc;

   @MockBean
   private GroupController groupController;

   ObjectMapper om = new ObjectMapper();

   @Test
   public void createGroupTest() throws Exception {
     GroupCreateRequest createRequest = new GroupCreateRequest();
     createRequest.setActiveFlag(true);
     createRequest.setGroupName("test");
     createRequest.setPlantCode(1L);

     String expectedjson = "{\r\n"   "\"message\": \"Group created successfully\"\r\n"   "}";

     MvcResult result = mockMvc.perform(post("/group/createGroup")
         .contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE).content(new Gson().toJson(createRequest)))
       .andExpect(status().isOk())
       .andReturn();
     String actualJson = result.getResponse().getContentAsString();
     Assert.assertEquals(expectedjson, actualJson);
   }

Controller:

  @RestController
  @RequestMapping(value = "/group")
  public class GroupController {

    @Autowired
    private GroupService groupService;

    @PostMapping("/createGroup")
    public ResponseEntity<Response> createGroup(@RequestBody GroupCreateRequest groupCreateRequest) {
      Response response = groupService.createGroup(groupCreateRequest);
      return new ResponseEntity<> (response, HttpStatus.OK);
    }
}

Error:

    org.junit.ComparisonFailure: expected:<[{
    "message": "Group created successfully"
    }]> but was:<[]>
        at org.junit.Assert.assertEquals(Assert.java:115)
        at org.junit.Assert.assertEquals(Assert.java:144)
        at com.nissan.car.manufacturing.system.CarManufacturingSystemApplicationTests.createGroupTest(CarManufacturingSystemApplicationTests.java:87)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)

Service implementation

public Response createGroup(GroupCreateRequest groupCreateRequest) {
        Group group = new Group();
        Response response = new Response();
        try {
            addGroupDetails(groupCreateRequest, group);
            groupRepository.save(group);

CodePudding user response:

Note that your are testing GroupController, not GroupService, so you should mock the GroupService. Please replace

@MockBean
private GroupController groupController;

to

@MockBean
private GroupService groupService;

And then using simple stubbing directives when(something).thenReturn(somethingElse) to make your groupService return the response you specified.

@Test
public void createGroupTest() throws Exception {
    // ...
    Response response = new Response();
    response.setMessage("Group created successfully");
    when(groupService.createGroup(any())).thenReturn(response);
    // ...
    Assert.assertEquals(expectedjson, actualJson);
}
  • Related