如何在Junit中加载ApplicationContext java-config

时间:2015-08-10 18:48:09

标签: spring spring-mvc junit

我正在尝试将spring xml config移动到java config。现在,我能够使一切工作,除了一件事,就是在我的服务上运行junit。问题是我的junit测试无法检测应用程序上下文。因此,我如何在Junit中加载应用程序上下文基于java的配置?由于我可以在浏览器上运行我的服务,我认为我的集成是正确的,这意味着我的测试配置不正确,但我无法找到我的错误。

这是我的junit配置:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
                classes={Bootstrap.class, RootContextConfig.class
                        , WebServletContextConfig.class, PersistenceConfig.class })
@WebAppConfiguration
//@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true)
public class BaseTest  { ... }

以防万一,我也在这里包含我的应用程序上下文配置。 这是我的引导程序

public class Bootstrap implements WebApplicationInitializer 
{
    @Override
    public void onStartup(ServletContext container)
            throws ServletException {

        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(RootContextConfig.class);
        container.addListener(new ContextLoaderListener(rootContext));

        AnnotationConfigWebApplicationContext servletContext = new AnnotationConfigWebApplicationContext();
        servletContext.register(WebServletContextConfig.class);
        ServletRegistration.Dynamic dispatcher = container.addServlet(
                            "SpringDispatcher", new DispatcherServlet(servletContext));

        dispatcher.setLoadOnStartup(1); 
         dispatcher.addMapping("/");
    }
}

我的RootContext

@Configuration                                                                          
@EnableScheduling
@EnableAsync(
                mode=AdviceMode.PROXY,  proxyTargetClass=false,
                order=Ordered.HIGHEST_PRECEDENCE
)           
@ComponentScan(
            basePackages={"com.core", "com.common"},
            excludeFilters=@ComponentScan.Filter(Controller.class)
        )
@Import({PersistenceConfig.class})
public class RootContextConfig {...}

我的WebServletContext

@Configuration
@EnableWebMvc               
@ComponentScan(         
        basePackages =  { "com.web" },
        useDefaultFilters = false,
        includeFilters = @ComponentScan.Filter({Controller.class, ControllerAdvice.class})
)
public class WebServletContextConfig extends WebMvcConfigurerAdapter {..}

我的PersistentContext

@Configuration
@EnableTransactionManagement(
        mode=AdviceMode.PROXY, proxyTargetClass=false
        , order=Ordered.LOWEST_PRECEDENCE)
public class PersistenceConfig {


    @Bean
    public DataSource customerSupportDataSource() {
        //JndiDataSourceLookup lookup = new JndiDataSourceLookup();\
        BasicDataSource basic = new BasicDataSource();
        basic.setDriverClassName(KEY_DRIVER_CLASS);
        basic.setUrl(KEY_DB_URL);
        basic.setUsername(KEY_DB_USERNAME);
        basic.setPassword(KEY_DB_PASSWORD);
        return basic;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
    {
            Map<String, Object> properties = new Hashtable<>();
            properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");

            HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
            adapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQLDialect");
            adapter.setGenerateDdl(true);
            adapter.setShowSql(true);
            LocalContainerEntityManagerFactoryBean factory =
                                                                    new LocalContainerEntityManagerFactoryBean();

            factory.setJpaVendorAdapter(adapter);
            factory.setDataSource(this.customerSupportDataSource());
            factory.setPackagesToScan("com.common.model");
            factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
            factory.setValidationMode(ValidationMode.NONE);
            factory.setJpaPropertyMap(properties);

            return factory;
    }

    @Bean
    public PlatformTransactionManager jpaTransactionManager()
    {
        return new JpaTransactionManager(
                this.entityManagerFactoryBean().getObject()
        );
    }   
}

0 个答案:

没有答案