나는 자원을 실행하기 위해 ResourceTestRule
을 사용하고 요청을하기 위해 저지를 클라이언트로 사용하는 기본 리소스 테스트를 가지고 있습니다. 대부분이 문서에서 직접 가져 왔습니다. 문제는 1) User
오브젝트의 유효성을 create
에두고 2) 오브젝트 -> JSON에서 갈 때 소금과 패스워드를 직렬화하지 않고 catchall로 응답에 노출되지 않게하고 싶습니다.Dropwizard 리소스 테스트, Jackson이 필드 채우기, 직렬화 해제 및 직렬화를 수행하지 않습니까?
테스트가 실패하고 내용이없는 422를 반환합니다. 최대 절전 모드 유효성 검사 오류 메시지는 절대로 끝내지 않으므로 끝내는 유일한 일은 Response.Status.OK
어설 션의 실패입니다. @NotEmpty
인 password
에 대한 유효성 검사 제한이 있습니다.이 점을 주석 처리하면 테스트가 통과됩니다. 나는 또한 편리하고 이후 JSON 응답에 노출되지 않을 것이라고 만들었습니다 이후 패스워드 게터를 @JsonIgnore
보내고 있지만, 나는 다른 방식으로 이것을 공개하고 있습니다. 내 최고의 추측은 Hibernate/Jersey의 내부 어딘가에서 저지 요청 (Entity.entity(user, MediaType.APPLICATION_JSON_TYPE)
)에 전달하는 엔티티가 deserialize되고 다시 직렬화되며, 암호를 얻을 수 없으므로 암호가 분실됨을 알 수 있습니다.
@ClassRule public static final ResourceTestRule
userResource =
ResourceTestRule.builder().addResource(new UserResource(USER_DAO, PERSON_DAO)).build();
검체 assertThat(response.getStatusInfo()).isEqualTo(Response.Status.OK);
에 실패 :
@POST
@Timed
public User create(@NotNull @Valid User user) {
if (user.getPerson() != null) {
try {
personDAO.save(user.getPerson());
// todo justin - abstract this
} catch (DuplicateKeyException e) {
throw new WebApplicationException("That person exists already.", Response.SC_BAD_REQUEST);
}
}
try {
user = userDAO.save(user).get();
} catch (DuplicateKeyException e) {
throw new WebApplicationException("That user exists already.", Response.SC_BAD_REQUEST);
}
return user;
}
가 예상된다 : 여기서
when(USER_DAO.save(any(User.class))).thenReturn(Optional.of(user));
when(PERSON_DAO.save(any(Person.class))).thenReturn(Optional.of(person));
final Response
response =
userResource.client().target("/user").request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(user, MediaType.APPLICATION_JSON_TYPE));
assertThat(response.getStatusInfo()).isEqualTo(Response.Status.OK);
verify(USER_DAO).save(userCaptor.capture());
verify(PERSON_DAO).save(personCaptor.capture());
User savedUser = userCaptor.getValue();
assertThat(savedUser).isEqualToIgnoringGivenFields(user, "salt", "password", "person");
assertThat(savedUser.getPerson()).isEqualToComparingFieldByFieldRecursively(user.getPerson());
실제 리소스 방법 여기
시험 규칙이며 사용자 (모의에서 돌아 오는 사람
UserDAO
) :
user = new User();
user.setEmail("[email protected]");
user.setPassword("test");
person = new Person();
person.setFirstName("Justin");
person.setLastName("K");
user.setPerson(person);
그리고 User
클래스의 관련 부분 :
public class User extends BaseModel implements Principal {
@Id
@JsonSerialize(using = ToStringSerializer.class)
private ObjectId id = new ObjectId();
@Email
@NotBlank
private String email;
@NotEmpty
private byte[] password;
private byte[] salt = Security.getSalt();
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@JsonIgnore // ignored when serialized FROM object TO json
public byte[] getPassword() {
return password;
}
@JsonProperty
public void setPassword(byte[] password) {
this.password = password;
}
@JsonProperty
public void setPassword(String password) {
this.password = Security.hashPassword(password.toCharArray(), this.getSalt());
}
@JsonIgnore // ignored when serialized FROM object TO json
public byte[] getSalt() {
return salt;
}
@JsonProperty
public void setSalt(byte[] salt) {
this.salt = salt;
}
그래, 나는 그것을 고려했다. 다른 방법이 없다면 아마 그렇게 하겠지만 테스트를 위해 내장 된 도구를 사용할 수 없으면 수치 스러울 것입니다. – Justin