使用 JsonPath 执行 Junit 测试不起作用

问题描述 投票:0回答:1

我正在剩余控制器方法 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 spring-boot junit spring-restcontroller
1个回答
0
投票

您需要使用java属性“firstName”,例如

...andExpect(jsonPath("$.firstName", is("James")))...

“first_name”是数据库中列的名称,不能在 Mockito 单元测试中使用它。

© www.soinside.com 2019 - 2024. All rights reserved.