Программисты JAVA общаются здесь
Anonymous
AssertionError: нет значения в пути JSON «$.id» при модульном тестировании API.
Сообщение
Anonymous » 13 янв 2025, 19:35
Я впервые пытаюсь написать тест для своего API и получаю эту ошибку java.lang.AssertionError: Нет значения по пути JSON "$.id" . Я протестировал свой API с помощью openApi, и он работал нормально. вот мой тестовый файл формы кода
Код: Выделить всё
package com.RCTR.usersys;
import com.RCTR.usersys.model.User;
import com.RCTR.usersys.service.UserService;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest
@AutoConfigureMockMvc
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@MockBean
private UserService userService;
@Test
public void createUserSuccess() throws Exception {
User newuser = User.builder()
.id(4L)
.firstName("Ion")
.lastName("Popescu")
.emailId("ion_popescu@gmail.com")
.build();
Mockito.when(userService.saveUser(newuser)).thenReturn(newuser);
String userJson = objectMapper.writeValueAsString(newuser);
MockHttpServletRequestBuilder mockRequest = MockMvcRequestBuilders.post("/api/v1/user")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(userJson);
mockMvc.perform(mockRequest)
.andDo(MockMvcResultHandlers.print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(4L))
.andExpect(jsonPath("$.firstName").value("Ion"))
.andExpect(jsonPath("$.lastName").value("Popescu"))
.andExpect(jsonPath("$.emailId").value("ion_popescu@gmail.com"));
}
}
проблема возникает в методе createUserSucces
и это мой контроллер
Код: Выделить всё
package com.RCTR.usersys.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.RCTR.usersys.model.User;
import com.RCTR.usersys.service.UserService;
@RestController
@RequestMapping("/api/v1/")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@PostMapping("/user")
public User saveUser(@RequestBody User user){
return userService.saveUser(user);
}
@GetMapping("/users")
public List getAllUsers(){
return userService.getAllUsers();
}
@GetMapping("/users/{id}")
public ResponseEntity getUserById(@PathVariable("id")Long id){
User user = null;
user = userService.getUserById(id);
return ResponseEntity.ok(user);
}
@DeleteMapping("/users/{id}")
public ResponseEntity deleteUser(@PathVariable("id")Long id){
boolean deleted = false;
deleted = userService.deleteUser(id);
Map response = new HashMap();
if (deleted) {
response.put("deleted", true);
return ResponseEntity.ok(response);
} else {
response.put("deleted", false);
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
}
}
@PutMapping("/users/{id}")
public ResponseEntity updateUser(@PathVariable("id")Long id,@RequestBody User user){
user = userService.updateUser(id,user);
return ResponseEntity.ok(user);
}
}
Заранее спасибо!
Подробнее здесь:
https://stackoverflow.com/questions/793 ... it-testing
1736786149
Anonymous
Я впервые пытаюсь написать тест для своего API и получаю эту ошибку java.lang.AssertionError: Нет значения по пути JSON "$.id" . Я протестировал свой API с помощью openApi, и он работал нормально. вот мой тестовый файл формы кода [code] package com.RCTR.usersys; import com.RCTR.usersys.model.User; import com.RCTR.usersys.service.UserService; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebMvcTest @AutoConfigureMockMvc public class UserControllerTest { @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; @MockBean private UserService userService; @Test public void createUserSuccess() throws Exception { User newuser = User.builder() .id(4L) .firstName("Ion") .lastName("Popescu") .emailId("ion_popescu@gmail.com") .build(); Mockito.when(userService.saveUser(newuser)).thenReturn(newuser); String userJson = objectMapper.writeValueAsString(newuser); MockHttpServletRequestBuilder mockRequest = MockMvcRequestBuilders.post("/api/v1/user") .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .content(userJson); mockMvc.perform(mockRequest) .andDo(MockMvcResultHandlers.print()) .andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(4L)) .andExpect(jsonPath("$.firstName").value("Ion")) .andExpect(jsonPath("$.lastName").value("Popescu")) .andExpect(jsonPath("$.emailId").value("ion_popescu@gmail.com")); } } [/code] проблема возникает в методе createUserSucces [b]и это мой контроллер[/b] [code]package com.RCTR.usersys.controller; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.RCTR.usersys.model.User; import com.RCTR.usersys.service.UserService; @RestController @RequestMapping("/api/v1/") public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } @PostMapping("/user") public User saveUser(@RequestBody User user){ return userService.saveUser(user); } @GetMapping("/users") public List getAllUsers(){ return userService.getAllUsers(); } @GetMapping("/users/{id}") public ResponseEntity getUserById(@PathVariable("id")Long id){ User user = null; user = userService.getUserById(id); return ResponseEntity.ok(user); } @DeleteMapping("/users/{id}") public ResponseEntity deleteUser(@PathVariable("id")Long id){ boolean deleted = false; deleted = userService.deleteUser(id); Map response = new HashMap(); if (deleted) { response.put("deleted", true); return ResponseEntity.ok(response); } else { response.put("deleted", false); return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response); } } @PutMapping("/users/{id}") public ResponseEntity updateUser(@PathVariable("id")Long id,@RequestBody User user){ user = userService.updateUser(id,user); return ResponseEntity.ok(user); } } [/code] Заранее спасибо! Подробнее здесь: [url]https://stackoverflow.com/questions/79352792/assertionerror-no-value-at-json-path-id-in-api-unit-testing[/url]