我正在尝试将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()
);
}
}