2014-04-10 3 views
1

서블릿을 테스트해야하는데, 이제는 정상적으로 작동합니다.Spring 관리 서블릿 테스트하기

서블릿은 봄 서비스를 사용해야하므로 해당이 방법 수정 :

마이그레이션 후
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(
    this, config.getServletContext()); // ImageServlet.java line 49 

4 봄하기를, 시험은 파산 현재는이 예외가 발생합니다 :

java.lang.IllegalStateException: 
No WebApplicationContext found: no ContextLoaderListener registered? 
at org.springframework.web.context.support.WebApplicationContextUtils. 
    getRequiredWebApplicationContext(WebApplicationContextUtils.java:84) 
at org.springframework.web.context.support.SpringBeanAutowiringSupport. 
    processInjectionBasedOnServletContext(SpringBeanAutowiringSupport.java:107) 
at package.ImageServlet.init(ImageServlet.java:49) 
at in.nasv.utils.ImageServletTest.accessingImageViaHttp(ImageServletTest.java:45) 
을 여기

는 ImageServletTest의 코드의 부분이다 :

// prepare servlet instance 
MockServletConfig config = new MockServletConfig(
    new MockServletContextPatched()); 
ImageServlet servlet = new ImageServlet(); 
servlet.init(config); // ImageServletTest, line 45 

및이 CLA를 패치 의 (실제로 지금은 패치되지 않음) :이 피하기 위해 어떻게해야하고 무엇

public class MockServletContextPatched extends MockServletContext{ } 

"찾을 수 없습니다의 WebApplicationContext : IllegalStateException이?가 등록되어 있지의 ContextLoaderListener을" ?

+0

실제로 Servlet을 테스트하기 위해'init()'메소드를 호출해야합니까? 그렇지 않다면 테스트에서'SpringBeanAutowiringSupport'에 의존하는 대신 Servlet을 인스턴스화하고 의존성을 수동으로 인젝션하는 것이 좋다. –

+0

대단한 접근 방식이지만 내 경우에는 적용 할 수 없습니다.Spring MockServletContext는 매우 제한적인 기능을 가지고있다. (setter와 getter는 고정 된 값만을 리턴한다. init()을 통해서만 적용 할 수있다. – joro

+0

Spring의'MockServletContext' **에는 setter가있다. Spring의'MockServletContext'에서 제한 사항은 무엇이라고 생각하십니까? 커스텀'MockServletContextPatched'에 특별한 점은 무엇입니까? –

답변

0

해결책을 찾았습니다. 그러나 충분히 명확하지만 해결책입니다.

이제 서블릿 초기화는 다음과 같습니다

servlet.doGet(request, response); 
assertEquals(response.getStatus(), 200); 
// assert everything you want 
+0

두 개의'ApplicationContext'를 로딩해서는 안됩니다. 하나면 충분합니다. 게다가, _Spring TestContext Framework_는 이미'WebApplicationContext'를위한 테스트 인프라를 설정합니다 ('MockServletContext','MockHttpServletRequest','MockHttpServletResponse' 포함). 그걸 한번 보셨나요? –

+0

[WebApplicationContext로드] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management-web) 및 [테스트 요청 및 세션 범위 콩] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-web-scoped-beans)을 참조하십시오. –

0

:

MockHttpServletResponse response = new MockHttpServletResponse(); 

URL serverUrl = new URL(propertyExtendedService.getServerAddress(true)); 
MockHttpServletRequest request = new MockHttpServletRequest(); 
request.setRequestURI("/what-you-want"); 
request.setPathInfo("/" + TEST_IMAGE); 
request.setContentType("image/jpeg"); 
request.addHeader("Accept", "image/jpeg;image/jpg;"); 

최종 단계는 반환 된 값을 필터를 호출하고 주장하는 것입니다

MockServletContext servletContext = new MockServletContextPatched(); 
MockServletConfig config = new MockServletConfig(servletContext); 
ImageServlet servlet = new ImageServlet(); 

ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("spring-data-app-context.xml"); 
DefaultListableBeanFactory dlbf = new DefaultListableBeanFactory(appContext.getBeanFactory()); 
GenericWebApplicationContext gwac = new GenericWebApplicationContext(dlbf);   
servletContext.setAttribute(GenericWebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, gwac); 
gwac.setServletContext(servletContext); 
gwac.refresh(); 

servlet.init(config); 

요청 및 표준 방식으로 응답을 준비 업데이트 : updated documentation for getServletContext()이 온라인 상태입니다.


그냥 봄의 MockServletContext에서 사용자 지정 MIME 형식을 구성하는 사용자 정의 MockServletContextPatched 클래스를 구현 할 필요가 없습니다.

스프링의 MockServletContext은 JAF (Java Activation Framework)를 사용하여 ServletContext.getMimeType(String) 메서드를 구현하므로 JAF의 MimetypesFileTypeMap.addMimeTypes(String) 메서드를 통해 다음과 같이 사용자 지정 MIME 형식을 구성하는 것은 매우 쉽습니다. 위의 JUnit 기반 테스트 코드에서

MockServletContext mockServletContext = new MockServletContext(); 
MimetypesFileTypeMap mimetypesFileTypeMap = 
    (MimetypesFileTypeMap) MimetypesFileTypeMap.getDefaultFileTypeMap(); 
mimetypesFileTypeMap.addMimeTypes("text/enigma enigma"); 
assertEquals("text/enigma", mockServletContext.getMimeType("filename.enigma")); 

, 나는 확장 .enigma을 가진 파일에 대한 사용자 지정 MIME 타입 "text/enigma"을 구성.

희망이 도움이됩니다.

감사합니다,

샘 (스프링 TestContext 프레임 워크의 저자)

추신 MockServletContext의 문서를 개선하기 위해 JIRA 발행 SPR-12126을 만들었습니다.

+0

안녕하세요. 내 해결 방법에 대한 솔루션을 주셔서 감사합니다. 죄송 합니다만,이 테스트를 중단했습니다 (이전의 모든 서블릿 기능이 삭제되어 해당 테스트도 삭제되었습니다). 그래서 테스트 할 수있었습니다. 귀하의 접근 방식은 우아한 접근 방식 인 것 같습니다. 하지만 ... – joro

+0

하지만 나는 그것이 더 나은지 잘 모르겠습니다. 대부분의 개발자는 일반적인 테스트 복식이 간단하고 하드 코딩 된 값이므로 설정 도구를 찾습니다. 다른 이유는 JAF가 일반적으로 알려지지 않은 것 같기 때문에 MimetypesFileTypeMap은 건너 뛸 수 있습니다. 그러나 이것은 제 의견입니다, 나는 틀린 것입니다. 다시 10 배. – joro

관련 문제