2011-01-07 14 views
8

Lo slow autowire by type problem è stato finalmente risolto creando una fabbrica di bean di memorizzazione nella cache.Personalizza BeanFactory con SpringJUnit4ClassRunner?

Mi piacerebbe molto essere in grado di utilizzare un CachingByTypeBeanFactory insieme a SpringJUnit4ClassRunner per l'esecuzione di test JUnit con @Autowired. Ma non sembra possibile cambiare la Factory Bean nel contesto dell'applicazione tramite ContextLoader.

C'è un altro modo per farlo?

risposta

8

Crea il tuo ContextLoader e allegare questa annotazione alla classe JUnit:

@ContextConfiguration(loader=YourLoader.class) 

Questo è il mio esempio Loader che crea un'istanza di un altro o personalizzato ApplicationContext, che a sua volta può essere inizializzato con personalizzato BeanFactory (a seconda delle capacità):

public class XmlWebApplicationContextLoader extends AbstractContextLoader { 

    public final ConfigurableApplicationContext loadContext(final String... locations) throws Exception { 
     ServletContext servletContext = new MockServletContext("war", new FileSystemResourceLoader()); 
     GenericWebApplicationContext webContext = new GenericWebApplicationContext(); 
     servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webContext); 
     webContext.setServletContext(servletContext); 
     new XmlBeanDefinitionReader(webContext).loadBeanDefinitions(locations);   
     AnnotationConfigUtils.registerAnnotationConfigProcessors(webContext); 
     webContext.refresh(); 
     webContext.registerShutdownHook(); 
     return webContext; 
    } 

    protected String getResourceSuffix() { 
     return ""; 
    } 

}

Nel contesto applicativo caso precedente (fornito da Spring Framework) presenta costruttore:

public GenericWebApplicationContext(DefaultListableBeanFactory beanFactory) { 
    super(beanFactory); 
} 
+0

E esattamente come questo aiuta? Ho letto il codice sorgente di ContextLoader e non riesco a far accettare il mio BeanFactory. E AFIK ContextLoader! = BeanFactory – krosenvold

+0

Quale tipo di contesto dell'applicazione stai usando? Puoi istanziare GenericApplicationContext con il nuovo BF e quindi restituirlo con il metodo loadContext del tuo caricatore personalizzato. – gertas

+0

Mi sembra giusto. ContextLoader è l'interfaccia che specifica come trasformare un array di stringhe in un contesto applicativo. – Pace