2016-03-18 17 views
1

Buna benzeyen bir JUnit testim var - daha büyük bir uygulamanın parçasıdır.Diğer JUnit testlerini Spring Root Controller'ımı çalmayı nasıl durdurabilirim?

@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); 
    } 
} 

Testimi yalıtılmış olarak çalıştırdığımda - düzgün çalışıyor.

diğer testlerin bir setinin bir parçası olarak çalıştırdığınızda - hatası alıyorum oluyor gibi görünmektedir ne

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) 

benim test bağlam diğer testlerle çalınması olmasıdır. Bunun ne zaman oluştuğunu ve nasıl durduğunu veya en azından etrafta nasıl çalıştığını bilmek istiyorum.

Soruma ilişkin soru: Diğer JUnit testlerini Spring Root Controller'ımı çalmayı nasıl durdurabilirim?

cevap

0

Bu bağlamı diğer sınama bağlamlarından ayırmak isteyebilirsiniz. Sen name attribute of @ContextConfiguration yoluyla bağlamı adlandırarak yapabilirsiniz:

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

Parlak öneri. Http://www.jroller.com/arondight/entry/mocking_a_webapplicationcontext_in_order yapmanın çok daha farklı bir yolu. Ne yazık ki, bunların her ikisi de http://stackoverflow.com/questions/10013288/another-unnamed-cachemanager-already-exists-in-the-same-vm-ehcache-2-5 ile hatalara girer. Yaptım - temel olarak bu http://stackoverflow.com/questions/7239786/how-to-invoke-the-same-maven-build-twice-in-one-call – hawkeye

0

kredi en anlayışlı cevap @luboskrnac gider. Benim için pek işe yaramadı - ben de bitirdiğim şeyi yazdım.

ben şöyle kök olmayan sınıf yükleyicisi Web Bağlamını izole çalıştı: - bu durum yukarıda önerilen @luboskrnac neyi aynıdır -

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(); 

İlginçtir ki ama onun çözümü çok daha şık .

Maalesef ehcache'mde bir hataya yol açıyor (ki bu da ortaya çıkıyor - sadece sınıf yükleyiciden veya Bahar bağlamında bölümlemeden bağımsız olarak JVM içinde bir kez sınıf yüklenmesini istiyor).

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]] 

Yani böyle ayrı güzelliğinde bir test yürütme parçası olarak testini koşuyordu bunu kadar sona erdi:

<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> 
İlgili konular