spring-boottestingjunitget-mapping

Spring Unit testing rest controller


What is the best and easiest solution to test these sample get mappings? Could you show some easy example?

@GetMapping("/")
public List<UserDto> get() {
    return userService.getUsers().stream().map((User user) -> toUserDto(user)).collect(Collectors.toList());
}

@GetMapping(path = "/{id}")
public HttpEntity<UserDto> findById(@PathVariable(name = "id") long id) {
    User user = userService.unique(id);
    if (user != null) {
        return new ResponseEntity<>(toUserDto(user), HttpStatus.OK);
    } else {
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }
}

Solution

  • Use MockMvc to test controller end points.

    @RunWith(MockitoJUnitRunner.class)
    public class UserControllerTest {
    
      @InjectMock
      private UserContoller userController;
    
      private MockMvc mockMvc;
    
      @Before
      public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(this.userController).build();
      }
    
      @Test
      public void testFindById() {
    
         // build your expected results here 
         String url = "/1";
         MvcResult mvcResult = mockMvc
        .perform(MockMvcRequestBuilders.get(url))
        .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
    
        String responseAsJson = "some expected response"; 
    
        Assert.assertEquals("response does not match", responseAsJson, mvcResult.getResponse().getContentAsString());
    
       // verify the calls
      }
    }
    

    EDIT : Adding link to my similar answer here for your reference Spring 5 with JUnit 5 + Mockito - Controller method returns null