Annotation 인스턴스 생성하여 단위테스트하기 프로그래밍

단위 테스트를 작성하는데 해당 모듈이 Java Annotation을 가지고 조건 분기를 한다면 당연히 어노테이션의 인스턴스를 생성해야만 정상적인 테스트가 가능해진다.

이것 때문에 처음에는 단위테스트에 별개의 비어있는 클래스와 메소드 등을 만들고 거기다 어노테이션을 원하는 조합으로 지정한 뒤에 그것을 리플렉션으로 어노테이션 인스턴스를 뽑아내서 사용했었는데, 역시나 뭔가 삽질 같았다.

그러다가 아주 당연한 것을 깨닫는다. Java의 어노테이션은 일종의 interface(@interface)이다! Create Annotation instance with defaults, in Java 참조

인터페이스이므로 클래스로 구현해서 인스턴스를 생성하면 되는 것이다.

아래와 같이 간결하게 해결이 된다. 그 외에 내가 썼던 해결책들은 http://wiki.kwonnam.pe.kr/java/annotation 에 함께 기록해 두었다.

// 아래와 같은 어노테이션이 있을 때!
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginUser {
  boolean required() default true;
  SomeValue [] someValues() default {};
}
 
// 아래와 같이 클래스로 구현한 뒤에 해당 클래스의 인스턴스를 생성하면 된다.
public class FakeLoginUser implements LoginUser {
 
  private boolean requiredValue = true;
 
  private SomeValue[] someValueValue = {};
 
  public FakeLoginUser(boolean requiredValue, SomeValue[] someValueValue) {
    this.requiredValue = requiredValue;
    this.someValueValue = someValueValue;
  }
 
  @Override
  public Class<? extends Annotation> annotationType() {
    return LoginUser.class;
  }
 
  @Override
  public boolean required() {
    return requiredValue;
  }
 
  @Override
  public SomeValue[] someValue() {
    return someValueValue;
  }
}

덧글

  • 견가가 2012/06/29 13:14 # 삭제

    Interface 로만 테스트 하려면 mock 을 쓰는게 더 낳을듯 합니다~ ㅎ
  • 권남 2012/06/29 22:45 #

    네, 막상 해보면 Mock으로 만들고 Mock에 값을 세팅하면 편리 메소드 하나 만드는게 코드량이나 불필요한 이클립스 경고남발 피하기 등의 면에서 더 나은 것 같습니다.
※ 로그인 사용자만 덧글을 남길 수 있습니다.