How to write a unit test for a Spring Boot Controller endpoint

后端 未结 5 718
梦毁少年i
梦毁少年i 2020-12-07 12:22

I have a sample Spring Boot app with the following

Boot main class

@SpringBootApplication
public class DemoApplication {

    public static void mai         


        
5条回答
  •  甜味超标
    2020-12-07 12:47

    Let assume i am having a RestController with GET/POST/PUT/DELETE operations and i have to write unit test using spring boot.I will just share code of RestController class and respective unit test.Wont be sharing any other related code to the controller ,can have assumption on that.

    @RestController
    @RequestMapping(value = “/myapi/myApp” , produces = {"application/json"})
    public class AppController {
    
    
        @Autowired
        private AppService service;
    
        @GetMapping
        public MyAppResponse get() throws Exception {
    
            MyAppResponse response = new MyAppResponse();
            service.getApp().stream().forEach(x -> response.addData(x));    
            return response;
        }
    
    
        @PostMapping
        public ResponseEntity create(@RequestBody AppRequest request) throws Exception {
            //Validation code       
            service.createApp(request);
    
            return ResponseEntity.ok(HttpStatus.OK);
        }
    
        @PutMapping
        public ResponseEntity update(@RequestBody IDMSRequest request) throws Exception {
    
            //Validation code
            service.updateApp(request);
    
            return ResponseEntity.ok(HttpStatus.OK);
        }
    
        @DeleteMapping
        public ResponseEntity delete(@RequestBody AppRequest request) throws Exception {
    
            //Validation        
            service.deleteApp(request.id);
    
            return ResponseEntity.ok(HttpStatus.OK);
        }
    
    }
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = Main.class)
    @WebAppConfiguration
    public abstract class BaseTest {
       protected MockMvc mvc;
       @Autowired
       WebApplicationContext webApplicationContext;
    
       protected void setUp() {
          mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
       }
       protected String mapToJson(Object obj) throws JsonProcessingException {
          ObjectMapper objectMapper = new ObjectMapper();
          return objectMapper.writeValueAsString(obj);
       }
       protected  T mapFromJson(String json, Class clazz)
          throws JsonParseException, JsonMappingException, IOException {
    
          ObjectMapper objectMapper = new ObjectMapper();
          return objectMapper.readValue(json, clazz);
       }
    }
    
    public class AppControllerTest extends BaseTest {
    
        @MockBean
        private IIdmsService service;
    
        private static final String URI = "/myapi/myApp";
    
    
       @Override
       @Before
       public void setUp() {
          super.setUp();
       }
    
       @Test
       public void testGet() throws Exception {
           AppEntity entity = new AppEntity();
          List dataList = new ArrayList();
          AppResponse dataResponse = new AppResponse();
          entity.setId(1);
          entity.setCreated_at("2020-02-21 17:01:38.717863");
          entity.setCreated_by(“Abhinav Kr”);
          entity.setModified_at("2020-02-24 17:01:38.717863");
          entity.setModified_by(“Jyoti”);
                dataList.add(entity);
    
          dataResponse.setData(dataList);
    
          Mockito.when(service.getApp()).thenReturn(dataList);
    
          RequestBuilder requestBuilder =  MockMvcRequestBuilders.get(URI)
                     .accept(MediaType.APPLICATION_JSON);
    
            MvcResult mvcResult = mvc.perform(requestBuilder).andReturn();
            MockHttpServletResponse response = mvcResult.getResponse();
    
            String expectedJson = this.mapToJson(dataResponse);
            String outputInJson = mvcResult.getResponse().getContentAsString();
    
            assertEquals(HttpStatus.OK.value(), response.getStatus());
            assertEquals(expectedJson, outputInJson);
       }
    
       @Test
       public void testCreate() throws Exception {
    
           AppRequest request = new AppRequest();
           request.createdBy = 1;
           request.AppFullName = “My App”;
           request.appTimezone = “India”;
    
           String inputInJson = this.mapToJson(request);
           Mockito.doNothing().when(service).createApp(Mockito.any(AppRequest.class));
           service.createApp(request);
           Mockito.verify(service, Mockito.times(1)).createApp(request);
    
           RequestBuilder requestBuilder =  MockMvcRequestBuilders.post(URI)
                                                                 .accept(MediaType.APPLICATION_JSON).content(inputInJson)
                                                                 .contentType(MediaType.APPLICATION_JSON);
    
           MvcResult mvcResult = mvc.perform(requestBuilder).andReturn();
           MockHttpServletResponse response = mvcResult.getResponse();
           assertEquals(HttpStatus.OK.value(), response.getStatus());
    
       }
    
       @Test
       public void testUpdate() throws Exception {
    
           AppRequest request = new AppRequest();
           request.id = 1;
           request.modifiedBy = 1;
            request.AppFullName = “My App”;
           request.appTimezone = “Bharat”;
    
           String inputInJson = this.mapToJson(request);
           Mockito.doNothing().when(service).updateApp(Mockito.any(AppRequest.class));
           service.updateApp(request);
           Mockito.verify(service, Mockito.times(1)).updateApp(request);
    
           RequestBuilder requestBuilder =  MockMvcRequestBuilders.put(URI)
                                                                 .accept(MediaType.APPLICATION_JSON).content(inputInJson)
                                                                 .contentType(MediaType.APPLICATION_JSON);
    
           MvcResult mvcResult = mvc.perform(requestBuilder).andReturn();
           MockHttpServletResponse response = mvcResult.getResponse();
           assertEquals(HttpStatus.OK.value(), response.getStatus());
    
       }
    
       @Test
       public void testDelete() throws Exception {
    
           AppRequest request = new AppRequest();
           request.id = 1;
    
           String inputInJson = this.mapToJson(request);
           Mockito.doNothing().when(service).deleteApp(Mockito.any(Integer.class));
           service.deleteApp(request.id);
           Mockito.verify(service, Mockito.times(1)).deleteApp(request.id);
    
           RequestBuilder requestBuilder =  MockMvcRequestBuilders.delete(URI)
                                                                 .accept(MediaType.APPLICATION_JSON).content(inputInJson)
                                                                 .contentType(MediaType.APPLICATION_JSON);
    
           MvcResult mvcResult = mvc.perform(requestBuilder).andReturn();
           MockHttpServletResponse response = mvcResult.getResponse();
           assertEquals(HttpStatus.OK.value(), response.getStatus());
    
       }
    
    }
    

提交回复
热议问题