Test Fixture 편리하게 만들기 (feat.Accessors)

Uk·2024년 5월 16일
0

Test Fixture

  • 테스트를 실행하기 위한 초기 설정, 상태를 의미합니다.
  • 동일하거나 유사한 객체들이 사용되는 객체들에 대해서 중복되지 않도록 하여 비용 절감이 가능합니다.

Domain

Domain Layer 객체인 User에 대해서 예시를 들어보겠습니다.
테스트를 위한 생성자로 default 접근 제어자와 @VisibleForTesting 을 기입하였습니다.

@Getter
@Entity
@Table(name = "users")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String email;
    private String username;

    @Builder
    public User(String email, String username) {
        this.email = email;
        this.username = username;
    }

    @VisibleForTesting
    User(Long id, String email, String username) {
        this.id = id;
        this.email = email;
        this.username = username;
    }

Fixture

public class UserFixture {

    private Long id = 1L;
    private String email = "name@domain.com";
    private String username = "username";

    public static UserFixture aUser() {
        return new UserFixture();
    }

    public UserFixture id(final Long id) {
        this.id = id;
        return this;
    }

    public UserFixture email(final String email) {
        this.email = email;
        return this;
    }

    public UserFixture username(final String username) {
        this.username = username;
        return this;
    }

    public User build() {
        return new User(id, email, username);
    }
}

위와 같이 도메인 객체에 대해서 Fixture를 만들어줌으로써 추후 많은 곳에서 기본 포맷을 가지는 UserFixture를 가질 수 있게 됩니다.

Fixture를 만들 때마다 수 많은 필드로부터 하나 하나 수작업을 해줘야 하는 단점이 있습니다.

해당 예시에 대해서 @Setter / @Builder 를 사용하고 조금의 작업을 해준다면 해결되는 문제겠지만,
직접 사용하는 클라이언트 입장에서 조금 불편한 코드가 될 수 있습니다.

@Accessors

다음과 같이 @Setter@Accessors 를 사용하면 보다 편하게 Fixture를 생성할 수 있습니다!

@Setter
@Accessors(fluent = true, chain = true)
public class UserFixture {

    private Long id = 1L;
    private String email = "name@domain.com";
    private String username = "username";

    public static UserFixture aUser() {
        return new UserFixture();
    }

    public User build() {
        return new User(id, email, username);
    }
}

그렇다면 @Accessors 의 옵션에는 무엇이 있는지 알아보겠습니다.

  • fluent
    getter와 setter에 대해서 get / set 접두사를 제거합니다.
    ex) .setName()name()
  • chain
    setter에 대해서 return this 를 하여 체이닝 메서드로 사용할 수 있습니다.
  • prefix
    fluent와 동일한데, 일부 컨벤션에 따른 필드의 경우 접두사를 제거할 수 있는 옵션입니다.
  • makeFinal
    subclass에 대해서 getter와 setter를 override 못하게 final화 하는 옵션입니다.

참고 사이트

0개의 댓글