Я пытаюсь написать тестовые примеры для моего класса контроллера.
Это мой класс пользовательского контроллера
Код: Выделить всё
@RestController
@RequestMapping(URLConstants.User)
@Log4j2
@RequiredArgsConstructor(onConstructor = @__({ @Autowired }))
public class UsersController {
private final UserMapper mapper;
private final UserService userService;
@PutMapping("/{id}")
public UserDTO update(@PathVariable("id") Long id, @RequestBody UserUpdateRequest userRequest) {
log.debug("PUT /users/" + id + " with data" + userRequest);
User user = CurrentUserContext.getCurrentUser();
mapper.mergeToUser(userRequest, user);
user = userService.update(user);
return mapper.mapDTO(user);
}
}
Код: Выделить всё
@SpringBootTest(classes = UsersController.class)
@AutoConfigureMockMvc(addFilters = false)
@ExtendWith(MockitoExtension.class)
public class UsersControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserMapper userMapper;
@MockBean
private UserService userService;
@Mock
private CurrentUserContext currentUserContext;
@InjectMocks
private UsersController usersController;
private final ObjectMapper objectMapper = new ObjectMapper();
@Test
@DisplayName("Test successful user update")
public void testUpdateUserSuccess() throws Exception {
// Prepare test data
Long userId = 1L;
UserUpdateRequest userUpdateRequest = new UserUpdateRequest();
userUpdateRequest.setFirstName("John");
userUpdateRequest.setLastName("Doe");
User updatedUser = new User();
updatedUser.setId(userId);
updatedUser.setFirstName(userUpdateRequest.getFirstName());
updatedUser.setLastName(userUpdateRequest.getLastName());
updatedUser.setStatus(UserStatus.Active);
updatedUser.setCreatedDate(new Timestamp(System.currentTimeMillis()));
updatedUser.setUpdatedDate(new Timestamp(System.currentTimeMillis()));
// Mock the service method
when(userService.update(updatedUser)).thenReturn(updatedUser);
// Perform the request and verify the response
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(usersController).build();
mockMvc.perform(MockMvcRequestBuilders.put("/users/{id}", userId)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(userUpdateRequest)))
.andExpect(status().isOk());
/*.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.id").value(userId))
.andExpect(jsonPath("$.firstName").value(userUpdateRequest.getFirstName()))
.andExpect(jsonPath("$.lastName").value(userUpdateRequest.getLastName()));*/
}
@Test
@DisplayName("Test invalid user update request")
public void testUpdateUserInvalidRequest() throws Exception {
// Prepare test data
Long userId = 1L;
UserUpdateRequest userUpdateRequest = new UserUpdateRequest();
// Empty update request
// Perform the request and verify the response
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(usersController).build();
mockMvc.perform(MockMvcRequestBuilders.put("/users/{id}", userId)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(userUpdateRequest)))
.andExpect(status().isBadRequest());
}
}
Код: Выделить всё
Jakarta.servlet.ServletException: Request processing failed: java.lang.NullPointerException: Cannot invoke "com.app.users.services.UserService.update(com.app.users.models.User)" because "this.userService" is null
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1019)
at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:925)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:550)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
…….
…….
Cannot invoke "com.app.users.services.UserService.update(com.app.users.models.User)" because "this.userService" is null
java.lang.NullPointerException: Cannot invoke "com.app.users.services.UserService.update(com.app.users.models.User)" because "this.userService" is null
at com.app.users.controllers.UsersController.update(UsersController.java:51)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)
at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:925)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:550)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
Подробнее здесь: https://stackoverflow.com/questions/781 ... nvoke-serv