2016-03-18 10 views
1

私はこのようなJUnitテストを行っています。これは、より大きなアプリケーションの一部です。Spring Root Controllerを盗む他のJUnitテストを中止するにはどうしたらいいですか?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { MyTestConfig.class }) 
public class MyHandlerInterceptorTest { 

    @Autowired 
    private RequestMappingHandlerMapping requestMappingHandlerMapping; 

    @Test 
    public void myTest() throws Exception { 
     MockHttpServletRequest request = new MockHttpServletRequest("GET", 
      "/myrequest"); 
     HandlerExecutionChain handlerExecutionChain = requestMappingHandlerMapping.getHandler(request); 
    } 
} 

テストを単独で実行すると、正常に動作します。

私は他のテストのスイートの一部としてそれを実行 - 私が起こっているように見える何

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.MyHandlerInterceptorTest ': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping com.MyHandlerInterceptorTest.requestMappingHandlerMapping; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Initialization of bean failed; nested exception is org.springframework.context.ApplicationContextException: Cannot reinitialize with different application context: current one is [Root WebApplicationContext: startup date [XXX 2016]; root of context hierarchy], passed-in one is [[email protected]60457f: startup date [XXX 2016]; root of context hierarchy] 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:376) 
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:110) 
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75) 
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:313) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211) 
.... 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping com.MyHandlerInterceptorTest.requestMappingHandlerMapping; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Initialization of bean failed; nested exception is org.springframework.context.ApplicationContextException: Cannot reinitialize with different application context: current one is [Root WebApplicationContext: startup date [XXX 2016]; root of context hierarchy], passed-in one is [[email protected]60457f: startup date [Fri Mar 18 11:01:19 EST 2016]; root of context hierarchy] 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514) 

エラーを取得するには、私のテストコンテキストが他のテストによって盗まれていることです。私はこれがいつ発生するのかを特定し、それを止める方法、または少なくともそれを回避する方法を知りたい。

私の質問は:Spring Root Controllerを盗む他のJUnitテストを中止するにはどうしたらいいですか?

答えて

0

このコンテキストを他のテストコンテキストから分離したい場合があります。あなたはname attribute of @ContextConfiguration経由で名前付けコンテキストでそれを行うことができます。

@ContextConfiguration(loader = AnnotationConfigContextLoader.class, 
    classes = { MyTestConfig.class }, name = "UniqueName") 
+0

ブリリアント提案。 http://www.jroller.com/arondight/entry/mocking_a_webapplicationcontext_in_orderを行うもっと簡単な方法です。残念なことに、これらの両方ともエラーが発生します。http://stackoverflow.com/questions/10013288/another-unnamed-cachemanager-already-exists-in-theame-vm-ehcache-2-5 私は何を書きますか?私はそうしました - 基本的にこれはhttp://stackoverflow.com/questions/7239786/how-to-invoke-the-same-maven-build-twice-in-one-call – hawkeye

0

信用が最も洞察に満ちた答えを@luboskrnacに進みます。それは私のためにはうまくいきませんでした。だから、私がやったことを書き留めています。

私はそうのような非ルートクラスローダでのWebコンテキストを隔離しようとした:

import org.springframework.beans.factory.support.DefaultListableBeanFactory; 
import org.springframework.mock.web.MockServletContext; 
import org.springframework.web.context.support.GenericWebApplicationContext; 

DefaultListableBeanFactory dlbf = new DefaultListableBeanFactory(getApplicationContext().getBeanFactory()); 
GenericWebApplicationContext gwac = new GenericWebApplicationContext(dlbf); 
MockServletContext mockServletContext = new MockServletContext(); 
mockServletContext .setAttribute(GenericWebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, gwac); 
gwac.setServletContext(msc); 
gwac.refresh(); 

は興味深いことに - これは事実@luboskrnacは、上記に示唆するものと同じである - しかし、彼のソリューションは、はるかにエレガントです。

残念ながら、これは私のehcacheでエラーに繋がります(クラスローダーやSpringコンテキストのパーティション化に関係なく、JVMの内部で一度クラスロードされたければなりません)。

SEVERE: Servlet.service() for servlet [SpringDispatcher] in context with path [/FileService] threw exception [com.sun.jersey.api.container.ContainerException: Unable to create resource class com.myapp.FileStoreAccessAction] with root cause 
net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following: 
1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessary 
2. Shutdown the earlier cacheManager before creating new one with same name. 
The source of the existing CacheManager is: InputStreamConfigurationSource [[email protected]] 

それでは、私がやってしまったことは、このような個別の確実なテスト実行の一部としてテストを実行していた。

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <executions> 
      <execution> 
       <phase>test</phase> 
       <id>test-1</id> 
       <configuration> 
        ... 
       </configuration> 
       <goals><goal>test</goal></goals> 
      </execution> 
      <execution> 
       <phase>test</phase> 
       <id>test-2</id> 
       <configuration> 
        ... 
       </configuration> 
       <goals><goal>test</goal></goals> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 
... 
</build> 
関連する問題