관련 기술을 테스트하는 것은 어렵다. 컨테이너에 올리고 수동테스트 하는 건 어렵지 않지만 컨테이너 밖에서 자동화된 단위/통합 테스트를 구성하는 것은 쉽지 않다. 하지만 불가능한 것은 아니다.

스프링의 웹 기술은 DispatcherServlet과 그 안에서 생성되는 WebApplicationContext가 기반이 된다. SpringMVC/@MVC를 쓰든 아답터를 이용해서 다른 웹 프레임워크가 연동되든 마찬가지다.

@MVC는 @RequestMapping을 이용해서 URL과 핸들러-메소드를 연결한다. Controller처럼 인터페이스가 정해져 있는 것은 아니고 메소드 시그니처와 파라미터의 조합을 통해서 매우 유연하게 웹 요청을 핸들링 하는 메소드를 작성할 수 있다. 파라미터, 리턴타입, 애노테이션의 조합에 따라 매우 다양한 방식으로 동작하기 때문에 그 경우를 모두 따져서 테스트 해보면서 익히지 않으면 제한적으로 밖에 사용할 수 없다. 문제는 이를 컨테이너에서 테스트 하는 것은 매우 번거롭다는 것이고 자동화 하기 힘들다는 것이다.

대신 컨테이너 밖에서 웹에서 동작하는 것처럼 테스트를 만들 수 있다면 다양한 테스트를 만들어서 @MVC가 동작하는 방식을 학습할 수 있다. request, session 스코프의 경우도 마찬가지이다. 이 스코프들이 동작하는 방식을 테스트 하는 것은 단순한 @MVC 매핑이나 MAV 기능을 테스트 하는 것보다 훨씬 더 복잡하다. 여러번의 요청과 여러 세션을 바꿔가면서 테스트를 해야 한다. 이것은 수동 테스트로도 매우 귀찮은 작업이다. 역시 자동화된 컨테이너 밖에서 동작하는 테스트를 만들 수 있다면 좋을 것이다.

HttpServletRequset와 Response를 이용해서 웹에서 동작하는 SpringMVC를 테스트 하려면 DispatcherServlet을 이용해야 한다. DispatcherServlet은 configClass 정보를 이용해서 자동으로 웹 컨텍스트를 만들고 지정된 설정파일을 읽어서 초기화 한다. 설정파일을 따로 만들어두고 DispatcherServlet을 직접 DI해주고 스프링이 제공하는 웹용 Mock 오브젝트를 사용하면 이런 스프링 웹 테스트를 만드는 것이 어렵지 않다.

하지만 오늘 도전해볼 것은 이전에 해본 것처럼 XML없이 스태틱 클래스와 애노테이션 설정만을 가지고 웹 테스트를 만드는 것이다.

DispatcherServlet의 빈 설정을 코드로 제어하고 싶다면 DispatcherServlet의 createWebApplicationContext() 메소드를 오버라이드 해서 직접 컨테스트를 만들게 하면 된다. 여기서 만들어지는 컨텍스트는 WebApplicationContext류여야 한다. 코드에 의해서 빈을 등록하게 할 수 있는 WAC는 StaticWebApplicationContext가 있다.

문제는 SWAC는 registerBeanDefinition()을 이용해서 빈 클래스를 등록하게 할 수는 있지만 기본적으로 애노테이션 설정을 적용하기 위해서 필요한 다양한 후처리기들이 내장되어 있지 않다. 따라서 @Autowired니 @Scope같은 것들이 적용되지 않는다. 5개에 달하는 <context:annotation-config/>에 의해서 등록되는 애노테이션 설정을 위한 후처리기를 수동으로 등록해주지 않으면 안된다. 매우 번거로운 일이다.

다음으로 고려해볼 WAC는 AnnotationConfigApplicationContext의 웹 버전이라고 할 수 있는 AnnotationConfigWebApplicationContext이다. 문제는 ACAC와 달리 ACWAC는 등록할 클래스를 직접 넣어주는 방법을 제공하지 않고 빈 스캐닝을 위한 폴더만 지정할 수 있다. ACAC와 ACWAC가 다른 사람이 개발한게 아닌가 하는 의심이 들정도로 제공하는 기능이 다르다. 물론 ACAC는 코드에 의해서 테스트 하는데 사용되는 것이 주 용도이고, ACWAC는 실전용이니 그럴 수도 있겠다 싶지만.

그래서 ACWAC를 사용하면서 XML없이, 스태틱 클래스로 만든 테스트용 빈을 추가할 방법은 없다. 스캐닝용 폴더를 따로 만들고 그 안에 빈 클래스를 넣지 않으면 안된다. 귀찮은 일이다.

그래서 ACWAC를 대신해서 AbstractRefreshableWebApplicationContext를 상속해서 애노테이션 리더를 이용해서 빈 클래스를 직접 등록할 수 있도록 만들어줄 필요가 있다. 이를 DispatcherServlet의 기본 컨텍스트 생성 메소드를 오버라이드해서 넣는다면 애노테이션 방식의 클래스를 바로 지정해서 빈으로 등록하고 DispatcherServlet을 테스트 할 수 있는 테스트용 DispatcherServlet을 만들 수 있다.

이렇게 만든 게 다음 클래스이다.

public class AnnotationConfigDispatcherServlet extends DispatcherServlet {
    private Class<?>[] classes;
    public AnnotationConfigDispatcherServlet(Class<?> …classes) {
        super();
        this.classes = classes;
    }
    protected WebApplicationContext createWebApplicationContext(ApplicationContext parent) {
        AbstractRefreshableWebApplicationContext wac = new AbstractRefreshableWebApplicationContext() {
            protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
                    throws BeansException, IOException {
                AnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader(beanFactory);
                reader.register(classes);
            }
        };

        wac.setServletContext(getServletContext());
        wac.setServletConfig(getServletConfig());
        wac.refresh();
        return wac;
    }
}

그리고 다음은 이를 이용해서 request scope빈이 매 request마다 하나씩만 만들어져서 사용되는 것을 테스트 해보려고 만든 코드이다. 내부에서 스코프가 어떻게 처리되는지 알 필요 없이 웹 기반의 스코프를 테스트 하는 코드를 이렇게 간단히 만들 수 있으니 매우 만족스럽다. session scope를 테스트 해보는 것도 어렵지 않다. Mock request의 session을 유지 또는 변경해가면서 scoped 빈의 변화를 살펴보면 된다. 여기서는 Provider를 사용했는데 Proxyed Scope를 이용하는 코드를 테스트 하는 것도 간단하다. @Scope의 proxyMode를 default에서 interface나 targetClass로 바꿔주고 Provider로 DL하는 대신 proxyed scope로 DI하게 바꾸면 된다. @RequestMapping의 테스트도 쉽게 만들 수 있다. 심심할 때 해보자.

MockHttpServletResponse response = new MockHttpServletResponse();
@Test
public void requestScope() throws ServletException, IOException {
    MockServletConfig ctx = new MockServletConfig();
    DispatcherServlet ds = new AnnotationConfigDispatcherServlet(HelloController.class, HelloService.class, RequestBean.class, BeanCounter.class);
    ds.init(new MockServletConfig());
    BeanCounter counter = ds.getWebApplicationContext().getBean(BeanCounter.class);
    ds.service(new MockHttpServletRequest("GET", "/hello"), this.response);
    assertThat(counter.addCounter, is(2));
    assertThat(counter.size(), is(1));
    ds.service(new MockHttpServletRequest("GET", "/hello"), this.response);
    assertThat(counter.addCounter, is(4));
    assertThat(counter.size(), is(2));
}
@RequestMapping("/") static class HelloController {
    @Autowired HelloService helloService;
    @Autowired Provider<RequestBean> requestBeanProvider;
    @Autowired BeanCounter beanCounter;
    @RequestMapping("hello") public String hello() {
        beanCounter.addCounter++;
        beanCounter.add(requestBeanProvider.get());
        helloService.hello();
        return "";
    }
}
static class HelloService {
    @Autowired Provider<RequestBean> requestBeanProvider;
    @Autowired BeanCounter beanCounter;
    public void hello() {
        beanCounter.addCounter++;
        beanCounter.add(requestBeanProvider.get());
    }
}
@Scope("request") static class RequestBean {}
static class BeanCounter extends HashSet { int addCounter = 0; };

Related posts:

  1. Inside Spring (5) PropertyPlaceholderConfigurer를 @Bean으로 정의해서는 안되는 이유
  2. Spring 상식퀴즈 (1) – DI 태클하기
  3. Spring 3.0 (56) @Bean 사용의 주의사항
  4. Spring 3.0 (58) Static Class를 XML없이 빈으로 등록하기
  5. Spring 3.0 (52) 반쪽짜리 3.0 RC1 공개
  6. S1A 2008 셋째날 – Spring JavaConfig
  7. Spring 3.0 EL (Spel)을 이용한 AssertThrows 확장 (1)
  8. Spring 3.0 (26) Spring Expression Language와 @Value
  9. Spring 3.0 EL (Spel)을 이용한 AssertThrows 확장 (2)
  10. [토스3] 테스트를 위한 필드 주입 유틸
  11. Spring 3.0 (60) 클래스패스 리소스를 지정할 때 주의사항과 팁
  12. Spring 3.0 (46) Spring 3.0 M4 릴리스
  13. Spring 3.0 (54) 드디어 등장한 ConfigurationClassApplicationContext
  14. 미리 보는 Spring 3.0.1의 변경사항
  15. Spring 3.0 (2) R-518 스프링의 새 모듈 OXM(Object/XML Mapping)

Facebook comments:

to “Inside Spring (6) 애노테이션 설정 지원 스프링 웹 테스트용 DispatcherServlet 만들기”

  1. usually posts some very intriguing stuff like this. If youre new to this site

  2. usually posts some quite exciting stuff like this. If you are new to this site

  3. Every as soon as inside a even though we select blogs that we study. Listed below would be the latest web-sites that we select

  4. one of our guests not too long ago proposed the following website

  5. always a massive fan of linking to bloggers that I like but really don’t get a whole lot of link really like from

  6. always a huge fan of linking to bloggers that I adore but really don’t get a whole lot of link love from

  7. just beneath, are numerous absolutely not connected web pages to ours, however, they’re certainly worth going over

  8. just beneath, are several absolutely not connected web sites to ours, having said that, they may be certainly worth going over

  9. although web-sites we backlink to below are considerably not associated to ours, we feel they are truly really worth a go by way of, so have a look

  10. although internet websites we backlink to beneath are considerably not related to ours, we feel they may be really really worth a go through, so have a look

  11. we like to honor lots of other web web-sites around the internet, even though they arent linked to us, by linking to them. Below are some webpages worth checking out

  12. usually posts some extremely interesting stuff like this. If you are new to this site

  13. the time to read or stop by the content material or sites we have linked to below the

  14. check beneath, are some absolutely unrelated internet sites to ours, having said that, they may be most trustworthy sources that we use

  15. Every once in a whilst we pick blogs that we read. Listed beneath are the most up-to-date web sites that we choose

  16. usually posts some extremely fascinating stuff like this. If youre new to this site

  17. cialis generika
    If you suspect an asthma strike coming for you beverage several cups of espresso, teas, or hot chocolate. Drinking beverages with coffee will assist wide open your breathing passages. In case your air passages are closed it may lead to a really poor symptoms of asthma invasion, so ensure you consume beverages with caffeine intake.
    propecia kaufen
    Maintain your apps structured using the folder attribute. The newest model of iOS permits customers to make folders. To get this done, faucet and carry an app’s symbol till it begins to transfer or jiggle. Then, drag the application until it is actually hovering more than yet another iphone app that you want in the very same file. Now just release. The iPad will instantly produce a folder with each iphone app symbols inside of.
    kamagra 100mg
    Steer clear of producing funds advances on your own a credit card, specifically, if it is for something that is not an unexpected emergency. As the service fees usually are not as high as pay day loan fees, they are very high. The funds you practice out will find yourself priced at frequently much more, when it is all explained and done.
    kamagra shop

  18. Sites of interest we have a link to

  19. propecia generico
    Loud snoring is definitely a extremely tough point to cope with, whether it is you that is impacted or a loved one. Often the correct understanding is what is needed so that you can cope with. Browse the write-up under that will help you handle any snoring loudly issues you or your family members may be having.
    acheter levitra
    To be successful in mlm, you must set distinct objectives. Figure out what it is that you are working to. Make a note of anything that you want to accomplish. Bust these desired goals into two classes, temporary targets and long term desired goals. Viewing your goals created down will assist offer you route for in which you wish to take your business.
    cialis prix
    Look around your different insurance coverage insurance coverage, in order that you always know what you will be and the things you aren’t taken care of for, in the event that you should utilize it. You don’t want to cover greater than you must, when your insurance policy covers that cost for you personally.
    kamagra porto

  20. we like to honor quite a few other online web sites on the net, even when they arent linked to us, by linking to them. Underneath are some webpages really worth checking out

  21. Sites of interest we’ve a link to

  22. just beneath, are several totally not associated web sites to ours, on the other hand, they are surely really worth going over

  23. very couple of websites that happen to be detailed below, from our point of view are undoubtedly effectively worth checking out

  24. Here is a great Blog You might Come across Exciting that we Encourage You

  25. we like to honor numerous other world-wide-web sites on the internet, even if they arent linked to us, by linking to them. Beneath are some webpages worth checking out

  26. Every the moment in a when we pick blogs that we read. Listed beneath would be the newest web pages that we choose

  27. that will be the end of this write-up. Here you will come across some sites that we assume you will enjoy, just click the hyperlinks over

  28. Sites of interest we’ve a link to

  29. check beneath, are some completely unrelated web sites to ours, nevertheless, they’re most trustworthy sources that we use

  30. the time to read or pay a visit to the subject material or web sites we have linked to beneath the

  31. Sites of interest we have a link to

  32. The details talked about in the report are some of the very best offered

  33. check beneath, are some totally unrelated websites to ours, on the other hand, they are most trustworthy sources that we use

  34. Here are a few of the websites we suggest for our visitors

  35. Here is a superb Weblog You might Locate Fascinating that we Encourage You

  36. very couple of internet sites that take place to become comprehensive below, from our point of view are undoubtedly nicely really worth checking out

  37. Wonderful story, reckoned we could combine a few unrelated information, nonetheless truly really worth taking a search, whoa did one particular study about Mid East has got a lot more problerms also

  38. below youll come across the link to some sites that we believe you must visit

  39. just beneath, are several entirely not associated internet sites to ours, nonetheless, they are certainly really worth going over

  40. we came across a cool internet site which you may possibly get pleasure from. Take a appear if you want

  41. Every after in a though we select blogs that we study. Listed below are the most recent websites that we choose

  42. please pay a visit to the web-sites we stick to, such as this one particular, because it represents our picks from the web

  43. we like to honor a lot of other internet internet sites around the net, even when they arent linked to us, by linking to them. Underneath are some webpages really worth checking out

  44. we prefer to honor a lot of other online web sites on the net, even when they arent linked to us, by linking to them. Underneath are some webpages worth checking out

  45. here are some links to websites that we link to because we believe they are worth visiting

  46. here are some links to internet sites that we link to because we believe they’re really worth visiting

  47. although sites we backlink to below are considerably not related to ours, we really feel they are truly really worth a go by means of, so possess a look

  48. please visit the sites we comply with, which includes this a single, as it represents our picks in the web

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