Spring boot를 만지다 보면 재밌는게 많이 등장한다. 참 잘 만든거 같다. 소스를 보다보면 Phillip Webb 이 양반과 Stephane Nicoll 이 양반 소스가 대 부분 이다. 소스를 보면 뭔 소린지는 몰라도 내 기준으로 볼 때는 아주 잘 만들어 보인다. 처음에 Stephane Nicoll 이 양반이 github에 자주 등장하고 이슈도 많이 처리 하길래 저 양반이 팀 리더인줄 알았는데 아니였다. Phillip Webb 이양반이 Spring boot 리더 중 한명이였다. 흠 그건 그렇고..

오늘 잠깐 살펴볼 내용은 spring boot test의 자동설정이다. 뭐 대단한것은 아니고 물론 만든사람은 고생했겠지만 쓰는 사람은 편하게..

1.4 버전부터 Test 코드를 만드는게 간편하고 다양해 졌다. 테스트쪽은 Phillip Webb 이 양반이 거의다 만들었다. 흠흠
예를들어 @WebMvcTest, @DataJpaTest, @JsonTest 등 굳이 Spring의 모든 Context를 올릴 필요 없이 특정하게 테스트만 할 수 있게 하는 어노테이션들이다.
한번 우리도 만들어보자.

일단 테스트를 위해 멀티 메이븐으로 작성했다. 그래야 자동설정이 되는지 안되는 알 수 있어서.. 물론 그냥 String으로 클래스명을 넣어도 되긴 하지만..

첫 번째로 해야 될 일은 자동설정 클래스를 만들어야 한다. 테스트 용도이니 아주 간단히 만들었다.

@Configuration
@ConditionalOnClass(EventBus.class)
public class GuavaAutoConfigure {

  @Bean
  public String str(){
    return "wonwoo";
  }
}

일단 위와 같이 자동 설정할 클래스를 만들자. GuavaAutoConfigure라고 했는데 서드파트 라이브러리 넣을게 생각나지 않아서 그냥 유명한 구아바 라이브러리 대상으로 만들었다. 그렇다고 구아바 라이브러리를 사용해서 코드를 짠건 아니다. 자동 설정 관련되서 넣어 두었다.

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>20.0</version>
    <optional>true</optional>
</dependency>

메이븐에는 위와 같이 넣어주면 된다. optional을 true로 한 이유는 해당 프로젝트에서만 사용하기 위해서이다. 위와 같이 설정하면 다른 프로젝트에 영향이 없다.

메이븐 설정도 되었다면 설정 어노테이션을 만들자.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@ImportAutoConfiguration
public @interface AutoConfigureTest {

}

@ImportAutoConfiguration 이 어노테이션은 특정 테스트를 작성할 때 유용하게 사용하는 어노테이션이라고 설명한다.

그리고 마지막으로 한가지 더 설정해줘야하는 부분이 있는데 기본적인 자동설정과 비슷한 설정이 필요하다. META-INF/spring.factories 이 파일에 다음과 같이 작성하자.

me.wonwoo.AutoConfigureTest=me.wonwoo.GuavaAutoConfigure

AutoConfigureTest이 어노테이션은 GuavaAutoConfigure 설정을 실행하라는 의미이다. 설정은 완료가 되었다.
이제 테스트를 해보자.

두번째 프로젝트에서 다음과 같이 테스트 케이스를 만들어보자.

@RunWith(SpringRunner.class)
@AutoConfigureTest
public class ApplicationTest {

  @Autowired(required = false)
  private String str;

  @Test
  public void autoConfigTest() {
    assertThat(str, is("wonwoo"));
  }

  @Test
  public void autoConfigNullTest() {
    assertThat(str, is(nullValue()));
  }
}

그리고 실행해보면 둘중에 하나는 에러가 난다. 현재는 autoConfigTest 테스트 케이스에서 에러가 발생한다. 왜냐하면 우리가 자동설정한 부분을 보면 @ConditionalOnClass(EventBus.class) 이 부분에서 EventBus(구아바) 클래스가 존재하지 않기에 str이 빈 으로 등록 되지 않았다. 구아바 라이브러리가 필요하니 넣어보자.

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>20.0</version>
</dependency>

메이븐에 다음과 같이 작성하고 autoConfigTest 테스트를 다시 해보자. 그럼 우리가 원하는 초록불이 뜨고 autoConfigNullTest 테스트는 실패가 된다.

우리도 이렇게 Spring boot의 자동설정과 함께 테스트를 좀 더 간편하고 다양하게 만들 수 있다. 하지만 코어 및 라이브러리 개발자가 아니라면 자동 설정은 만들지 않고 어노테이션만 만들어도 된다. 그때 그때 사용할 어노테이션과 설정만 만들어서 사용하면 된다. 보통은 그러지 않을까 싶다.

자주 사용해야만 하는 테스트 케이스의 패턴이 있다면 위와 같이 설정을 만들어서 사용도 한번 해보자. 그리고 일반적으로 많이 사용할 거라고 생각되면 Spring boot에 한번 contribute 할 수도 있지 않을까 생각된다.