2016-11-27 2 views
0

나는 자원을 실행하기 위해 ResourceTestRule을 사용하고 요청을하기 위해 저지를 클라이언트로 사용하는 기본 리소스 테스트를 가지고 있습니다. 대부분이 문서에서 직접 가져 왔습니다. 문제는 1) User 오브젝트의 유효성을 create에두고 2) 오브젝트 -> JSON에서 갈 때 소금과 패스워드를 직렬화하지 않고 catchall로 응답에 노출되지 않게하고 싶습니다.Dropwizard 리소스 테스트, Jackson이 필드 채우기, 직렬화 해제 및 직렬화를 수행하지 않습니까?

테스트가 실패하고 내용이없는 422를 반환합니다. 최대 절전 모드 유효성 검사 오류 메시지는 절대로 끝내지 않으므로 끝내는 유일한 일은 Response.Status.OK 어설 션의 실패입니다. @NotEmptypassword에 대한 유효성 검사 제한이 있습니다.이 점을 주석 처리하면 테스트가 통과됩니다. 나는 또한 편리하고 이후 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; 
    } 

답변

0

내가이 주위에 방법을 볼 수 있습니다. 대신 :

Entity.entity(user, MediaType.APPLICATION_JSON_TYPE) 

실제 사용자의 json (손으로 만든)을 사용해 볼 수 있습니다. 물론 테스트 용이 아닌 동일한 코드를 사용하면 작동하지 않습니다.

+0

그래, 나는 그것을 고려했다. 다른 방법이 없다면 아마 그렇게 하겠지만 테스트를 위해 내장 된 도구를 사용할 수 없으면 수치 스러울 것입니다. – Justin