2012-05-04 3 views
8

스프링 mvc 애플리케이션의 컨트롤러에 대한 통합 테스트를 작성하려고한다. 컨트롤러는 서비스 클래스를 호출하여 dao를 호출하여 저장소에서 데이터를 읽고 쓸 수 있습니다. DAO는 일부 구성을 조회해야합니다. 구성 bean은 WEB-INF/applicationContext.xml에 정의됩니다.내부적으로 ContextLoader.getCurrentWebApplicationContext()에 의존하는 Spring MVC 애플리케이션의 Junit 테스트를 작성한다.

나는이 같은 것을 사용하고 있습니다.

구성 설정 = (구성) ContextLoader.getCurrentWebApplicationContext()의 getBean ("설정");
비공개 String namespace = config.getProperty ("someproperty");

속성은 사육사에 저장되므로 스프링의 속성 관리 아티팩트를 사용하지 않습니다.

JUnit 테스트를 실행하는 동안 ContextLoader.getCurrentWebApplicationContext()는 항상 null을 반환합니다.

지금까지 다음과 같은 방법 살펴 보았다

:
1. 테드 영의 접근 방식 (스프링 MVC 통합 테스트를위한 단지 구글 검색 테드 젊은)
2. https://github.com/SpringSource/spring-test-mvc
3.이 사이트 .. 질문/8464919/단위 테스트 - 어 - 서블릿은 - 그 - 따라 -에 - 스프링 - webapplicationcontextutils-getre
4. 셀레늄/jWebUnit을 5. http://confluence.highsource.org/display/Hifaces20/Hifaces20+Testing+package+-+testing%2C+tracing+and+debugging+web+applications+with+Jetty

1
이 문제가 해결되지 않습니다. WebApplicationContext가 null로 유지됨
WebApplicationContext에 대한 지원이 봄 3.2에서 가능함을 의미하는 2 가지 상태가 있습니다.
3.이 점을 이해하지 못합니다. 어디에서 testApplicationContext 및 getServletContext()를 가져 옵니까?
4. 완전히 블랙 박스 테스트이므로이 방법을 사용하고 싶지 않습니다.
5. 현재 5를보고 있습니다. 그러나 서블릿 컨테이너를 시작해야합니다. 다른 대안이 없습니까?

제공할만한 도움을 주셔서 감사합니다. 기본 ContextLoader를 정확히 봄 ContextLoader를가 작동 한

@Ted 젊은 SO는 제가 saying.With 로더 = MockWebApplicationContextLoader 무엇 완료하는 것을 허용하지 않았다

감사 PixalSoft

, 그것은 사용할 수 안된다 webapp이 servletcontainer에 의해 초기화 될 때 뭔가 특별한 것이 있습니까? MockWebApplicationContextLoader에 대한 핸들을 얻는 것이 필요합니까? configton 객체를 삽입하는 것은 싱글 톤 객체에 대해 작동합니다. 그러나 모든 것이 싱글 톤일 수는 없습니다. 모든 생성자에서 구성 객체를 전달하는 것은 너무 지루한 것처럼 들립니다. 지금은 setter 메소드를 통해 autowired 된 정적 설정 객체를 가진 클래스를 만들었습니다. ApplicationContextAware.Many thx

답변

0

클래스 패스에 등록 정보 파일을 저장합니다.

지금과 같이 컨트롤러 클래스에서 해당 속성에 액세스 :

/*to access your filename.properties file */ 
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.properties")); 

String sServerLocation = properties.getProperty("key"); 

지금 당신은 당신의 속성 파일에 액세스 할 수 있습니다.

나는 그것이 효과가있을 것이라고 확신합니다.

+0

안녕하세요. 답장을 보내 주셔서 감사합니다. 우리는 분산 환경에 있기 때문에 등록 정보 파일에 등록 정보를 저장할 수 없으며 그 이유 때문에 사육사에 등록 정보를 저장해야합니다. 또한 ContextLoader.getCurrentWebApplicationContext()를 사용하면 응용 프로그램이 유닛 테스트를받지 못하게 될 것이라고 생각하지 않습니다. – user1373927

1

ContextLoader.getCurrentWebApplicationContext가 null을 반환하는 이유는 내 MockWebApplicationContextLoader를 사용할 때 웹 응용 프로그램 컨텍스트 나 특정 ContextLoader 구현을 사용하지 않기 때문입니다.

저장소가 Spring에 의해 관리되기 때문에 저장소에 설정 객체를 삽입하는 것이 어떻습니까? config 객체를 삽입하는 것이 config 객체에 액세스하는 가장 적절한 방법입니다. @PostConstruct로 주석 된 메소드에서 네임 스페이스 특성을 초기화 할 수 있습니다.

또는 DOA는 구성 중에 응용 프로그램 컨텍스트의 복사본을 받기 위해 ApplicationContextAware를 구현할 수 있습니다. 당신이 컨텍스트 경로에 대해 둘 이상의 XML을 추가해야하는 경우

MockServletContext sc = new MockServletContext(""); 
sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, 
     "/applicationContext-test.xml"); // <== Customize with your paths 
ServletContextListener listener = new ContextLoaderListener(); 
ServletContextEvent event = new ServletContextEvent(sc); 
listener.contextInitialized(event); 

그냥 같이 공백으로 구분 동일한 문자열에 넣어 :

+0

안녕하세요, loader = MockWebApplicationContextLoader를 사용하는 경우 웹 컨텍스트 로더가 웹 컨텍스트 로더에 의해 초기화 될 때 스프링 컨텍스트 로더가 정확하게 작동하는 것처럼 기본 컨텍스트 로더로 사용할 수 있습니까? MockWebApplicationContextLoader 핸들을 얻는 데 필요한 특별한 것이 있습니까? 오또, 이런 식으로 행동하지 않는다면, 왜 내가 그것을 필요로합니까? – user1373927

+2

아니요, ** 사용할 수 없습니다 **. ContextLoader를 구성하려면 MWACL을 확장해야하며, 그렇게하기위한 쉬운 방법은 없습니다. ContextLoader를 사용하는 것은 이런 종류의 이유 때문에 나쁜 생각입니다. ContextLoader를 사용하여 ApplicationContext에 대한 액세스 권한을 얻는 이유는 무엇인지 직접 물어야합니다. –

+0

우리는 ContextLoader를 사용하고 있습니다. 왜냐하면 스프링 빈을 필요할 때마다 삽입 할 수 없기 때문입니다. AFAIK ContextLoader.getCWAC()는 API의 유효한 사용법입니다. 고마워. – user1373927

3

는 JUnit 테스트의 시작 부분에 다음 코드를 추가합니다 :

sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, 
     "/applicationContext-test.xml /applicationContext-other.xml"); 
+0

매우 잘 솔루션, 자세한 내용은 더 많은 정보에 대한 문서를 추가하는 https://docs.spring.io/spring/docs/2.5.x/javadoc-api/org/springframework/mock/web/MockServletContext.html – VedX

3

WebApplication 컨텍스트를 ContextLoderListener에 수동으로 추가해야합니다. 이 방법이 효과적입니다.

@ContextConfiguration(locations = "classpath:module-test-beans.xml") 
@WebAppConfiguration 
public class SampleTest extends AbstractTestNGSpringContextTests { 

    @Autowired 
    private WebApplicationContext wac; 

    @BeforeClass 
    public void setUp() throws ServletException { 
     MockServletContext sc = new MockServletContext(""); 
     ServletContextListener listener = new ContextLoaderListener(wac); 
     ServletContextEvent event = new ServletContextEvent(sc); 
     listener.contextInitialized(event); 
    } 

    @Test 
    public void testMe() { 
     Assert.assertFalse(ContextLoader.getCurrentWebApplicationContext() == null); 
    } 
} 
관련 문제