import static으로 시작하는 static import는 주로 유틸리티성 메소드에 사용하는 스태틱 메소드나 스태틱 상수값 등을 사용할 때 적용하기 좋다. 지저분하게 클래스 이름이 주렁주렁 나오는 대신 깔끔하게 메소드 이름이나 값만 사용할 수 있으니 코드가 단순해지고 이해하기도 좋다. 물론 쓰기 편하다고 스태틱 메소드를 남용하면 안되겠지만.

자바 프로젝트에서 스태틱 메소드가 가장 활발하게 사용되는 곳은 테스트 코드다. JUnit 4.x 는 3.x까지와 다르게 수퍼 클래스를 상속하지 않고 테스트 클래스를 작성한다. 그래서 테스트 클래스가 별도의 상속구조를 가지거나 테스트 할 대상을 상속해서 테스트 클래스를 만드는 등의 기법을 적용하기 좋다. 반면에 상속을 하지 않으니 예전에 TestCase와 같은 수퍼클래스에 정의되어있던 assertEquals() 따위를 바로 사용할 수 없다. 어짜피 assertXXX 메소드는 독립적으로 실행되는 유틸리티성 메소드다. 스태틱 메소드로 만들어 적용하기 적절한 대상이다.

JUnit 4.x는 이런 메소드들을 org.junit.Assert 클래스에 스태틱 메소드로 정의해 두었다. JUnit 4.x에서 테스트 코드를 만들면 Assert.assertEquals() 처럼 스태틱 메소드를 써야 한다. 매번 Assert 클래스 이름이 나오는 것은 지저분하니 보통 static import를 사용하고 assertEquals()와 같은 식으로 간단히 코드에서 사용하게 된다.

Assert 메소드 뿐 아니다. 내가 애용하는 assertThat()의 경우는 hamcrest의 Matcher를 사용하는데 이때도 CoreMatchers 클래스의 is() 같은 스태틱 메소드를 사용하게 된다. Hamcrest Matcher를 확장한 JUnit이나 다른 오픈소스 Matcher를 이용한다면 해당 Matcher 스태틱 메소드도 import할 필요가 있다.

또 목 오브젝트를 사용한다면 EasyMock이나 Mockito 등에서 정의한 목 생성, 조작용 스태틱 메소드나 Mockito Matcher 스태틱 메소드도 사용해야 할 것이다.

이러다 보니 테스트 클래스를 만들 때마다 넣어줘야 할 static import가 제법 많다.

문제는 이클립스의 편리한 타입 검색, 자동 import 등의 기능이 스태틱 메소드에는 기본적으로 적용되자 않는다는 것이다. 프로젝트에서 사용하는 타입 정보야 미리 다 읽어들여서 몇 글자만 넣어도 빠르게 찾도록 만들어두었지만, 메소드 레벨까지 모두 지원하는 것은 너무 큰 부담이기 때문이다. 그래서 테스트 코드를 작성할 때 제법 많은 static import 문을 작성해야 하는데  상당히 번거롭다.

그래서 최신 이클립스에서는 static import를 보다 편하게 추가할 수 있도록 Favorites 라는 기능을 제공한다. 코드에서 자주 사용하는 스태틱 메소드나 스태틱 메소드를 가진 타입을 미리 Favorites에 등록해두면 해당 스태틱 메소드도 자동검색/완성 기능의 대상이 된다. 코드에서 assertThat이라고 입력하고 ctrl-space를 누르면 assertThat() 메소드를 바로 선택할 수 있고, 메소드를 사용하기 위해서 필요한 import 문도 자동으로 추가된다. 그래서 자주 쓰는 테스트용 스태틱 메소드를 등록해두고 사용하면 편리하다.

Favorites는 Preference의 Java – Editor – ContentAssist 아래 있다.

 

그런데 나는 Favorites을 사용하지 않는다. 한때 잠깐 쓰기는 했지만.

나는 코드를 작성할 때, 특히 테스트 코드를 작성할 때 리듬을 타면서 빠르게 코드를 완성해나가는 것을 즐긴다. 그런데 테스트 코드를 작성하다가 자꾸 static import를 위해서 타이핑을 멈추고 ctrl-space을 누르고 선택하는 것은 번거롭다. 한 두개래야지. 게다가 자동완성을 안하고 타이핑을 다 해버리면 끝장이다. 예를 들어 assertThat에서 멈추고 자동완성을 해서 import를 추가해줘야 하는데 그냥 빠르게 assertThat(xxx, is( yyyy )); 까지 치고 나면 당황스럽다. 그제서 키보드를 옮겨서 assertThat 뒤로 가서 ctrl-space를 누르고 assertThat() 메소드를 선택하면 import 만 깔끔하게 추가되야 할텐데, 바보 같은 이클립스는 메소드 템플릿을 다 추가해버린다. 그래서 코드가 assertThat(actual, matcher)xxx, is( yyy )); 처럼 볼쌍 사납게 변해버린다. (actual, matcher)를 지우고, 또 is 뒤에 가서 같은 짓을 반복해야 한다.

리듬은 끊기고 짜증만 난다. 그래서 테스트를 많이 작성하는 편인 나에게는 Favorites 기능이 그다지 매력적으로 느껴지지 않는다. 테스트 코드 작성을 위해서 Favorites 기능을 추천해주는 사람을 보면 과연 테스트 코드를 제대로 작성하고 있는 사람인지 의심부터 간다. –_-;;

 

그래서 Favorites는 조금 사용하다가 때려쳤다. 대신 static import를 위해서 Templates을 사용한다. Preference – Java – Editor 밑에 있는 Templates은 미리 간단한 이름를 정해놓고 이를 타이핑하고 ctrl-space를 누르면 미리 넣어둔 코드 조각(템플릿)이 한방에 나오는 기능이다. main은 main() 메소드를 만들 때 사용하고 sysout는 Sytem.out.println()을 만들어준다. 반복적으로 나오는 코드 패턴에 적용하기 좋다. 나는 여기에 ti라는 이름으로 다음과 같은 코드를 넣어놨다. ti는 test imports…

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.junit.matchers.JUnitMatchers.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;

자주 쓰는 static import 문장을 * 와일드카드를 적용해서 통채로 넣어둔 것이다. 그리고 테스트 클래스를 만들면 제일 먼저 위에서 ti라고 치고 ctrl-space를 눌러서 이 import문을 넣는다. 그러면 끝. 이제 스태틱 메소드를 맘것 사용하면 된다. 테스트 코드를 복사할 때도 아무런 문제가 없다. 그냥 빠르게 타이핑 해도 된다. Favorites로 매번 번거롭게 하나씩 import 를 추가하는 것보다 100배 낫다.

대충 테스트 코드가 완성되면 ctrl-shift-O를 눌러서 organize imports를 한번 해주면 깔끔한 import 문으로 정렬된다. 언제든지 import 하지 않은 것이 있으면 한번만 ti 템플릿을 적용해주면 그만이다.

Related posts:

  1. Spring 3.0 (58) Static Class를 XML없이 빈으로 등록하기
  2. 테스트 할 수 없는 것을 테스트 하기. Spring ROO와 static method mocking.
  3. Spring Expressions(SpEL)를 이용한 Mockito Argument Matcher 만들기
  4. 이클립스 마우스 제스처 플러그인 – egest
  5. JUnit assert 매쉬업
  6. 토비의 스프링 3이 나오기까지 (12)
  7. 이클립스에서 JUnit4 테스트의 특정 테스트메소드만 실행하기
  8. Spring기반의 Hibernate DAO Unit Test 만들기
  9. 인터페이스 프로그래밍과 IDE 코드네비게이션편의성
  10. Spring 3.0 (50) JUnit 4.5~4.7 겨우 지원성공 그리고 계속되는 악몽
  11. 스프링 빈의 이름은 한글로 지어도 된다
  12. Inside Spring (6) 애노테이션 설정 지원 스프링 웹 테스트용 DispatcherServlet 만들기
  13. Spring 3.0 (1) 프로젝트 구조와 빌드 시스템의 변화
  14. JUnitMax Core가 포함된 JUnit 4.6 릴리스
  15. S1A 2008 셋째날 – Spring JavaConfig

Facebook comments:

to “테스트 코드에서 static import를 편하게 넣는 방법”

  1. thanks for share!

  2. thank you for share!

  3. thank you for share!

  4. I do agree with all of the ideas you have presented in your post. They are very convincing and will definitely work. Still, the posts are very short for beginners. Could you please extend them a little from next time? Thanks for the post.
    :) #$# :(

  5. mtb shoes uk 테스트 코드에서 static import를 편하게 넣는 방법 » Toby’s Epril

  6. clark shoes 테스트 코드에서 static import를 편하게 넣는 방법 » Toby’s Epril

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha