我正在剩余控制器方法 addUser() 上运行单元测试,该方法在没有 JSON 路径的情况下成功执行。每当我尝试使用 jsonPath 执行严格的数据断言来验证 JSON 文档的内容时,我都会收到错误 No value at JSON path "$.first_name"。任何有关如何解决该问题的帮助将不胜感激。以下是代码示例
@Entity
@Table(名称=“用户”) 公共类 User 扩展 IdBaseEntity{
@JsonProperty("first_name")
@Column(name = "first_name", nullable = false, length = 45)
@NotBlank(message = "First name cannot be blank")
@Length(min = 2, max = 45)
private String firstName;
@JsonProperty("last_name")
@NotBlank(message = "Last name cannot be blank")
@Length(min = 2, max = 45)
@Column(name="last_name", nullable = false, length = 45)
private String lastName;
@NotBlank(message = "Email cannot be blank")
@Length(min = 2, max = 45)
@Column(nullable = false, unique = true, length = 45)
private String email;
@NotBlank(message = "Password name cannot be blank")
@Length(min = 2, max = 45)
@Column(nullable = false, length = 45)
private String password;
@JsonProperty("phone_number")
@Column(length = 13)
private String phoneNumber;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "users_roles",
joinColumns = @JoinColumn(name ="user_id"),
inverseJoinColumns = @JoinColumn(name="role_id")
)
private Set<Role> roles = new HashSet<>();
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public String toString() {
return "User [firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + ", password=" + password
+ ", phoneNumber=" + phoneNumber + "]";
}
}
服务接口
public interface UserService {
public User addUser(User user);
}
服务等级
@Service
公共类 UserServiceImpl 实现 UserService{
private UserRepository userRepo;
@Autowired
public UserServiceImpl(UserRepository userRepo) {
this.userRepo = userRepo;
}
@Override
public User addUser(User user) {
return userRepo.save(user);
}
}
休息控制器类
@RestController
@RequestMapping(“/api/v1/users”) 公共类 UserRestApiController {
private UserServiceImpl userService;
public UserRestApiController(UserServiceImpl userService) {
this.userService = userService;
}
@PostMapping
public ResponseEntity<User> addUser(@RequestBody @Valid User user){
User newUser = userService.addUser(user);
URI uri = URI.create("/api/v1/users");
return ResponseEntity.created(uri).body(newUser);
}
}
测试班
@WebMvcTest(UserRestApiController.class)
公共类 UserRestApiControllerTest {
//end point uri
private static final String END_POINT_PATH = "/api/v1/users";
@MockBean
private UserServiceImpl userService;
@Autowired MockMvc mockMvc;
@Autowired ObjectMapper objectMapper;
@Test
public void testAddUserShouldReturn201Created() throws Exception {
User user = new User();
user.setFirstName("James");
user.setLastName("Kwarteng");
user.setEmail("[email protected]");
user.setPassword("23464433");
user.setPhoneNumber("04233455");
//fakes the UserServiceImpl class
Mockito.when(userService.addUser(user)).thenReturn(user);
//convert user object to json object
String bodyContent = objectMapper.writeValueAsString(user);
//perform http request
mockMvc.perform(post(END_POINT_PATH).contentType("application/json").content(bodyContent))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.first_name", is("James")))
.andDo(print());
}
}
运行测试后出错。省略部分错误代码
java.lang.AssertionError:JSON 路径“$.first_name”没有值 在 org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath(JsonPathExpectationsHelper.java:302) 在 org.springframework.test.util.JsonPathExpectationsHelper.assertExistsAndReturn(JsonPathExpectationsHelper.java:326) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210) 引起原因:java.lang.IllegalArgumentException:json 不能为 null 或为空 在 com.jayway.jsonpath.internal.Utils.notEmpty(Utils.java:401)
您需要使用java属性“firstName”,例如
...andExpect(jsonPath("$.firstName", is("James")))...
“first_name”是数据库中列的名称,不能在 Mockito 单元测试中使用它。