【发布时间】:2018-07-26 11:45:52
【问题描述】:
我将以下 dbunit 配置放在我所有测试类的父类中:
@Configuration
public class MyDbUnitConfiguration {
@Bean
public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection() {
DatabaseConfigBean bean = new DatabaseConfigBean();
bean.setDatatypeFactory(new MySqlDataTypeFactory());
bean.setMetadataHandler(new MySqlMetadataHandler());
bean.setSkipOracleRecyclebinTables(true);
bean.setCaseSensitiveTableNames(false);
bean.setAllowEmptyFields(true);
String testDbName = getTestDbName();
LOG.debug("Test database name: " + testDbName);
DataSource dataSource = new DataSource();
dataSource.setUsername(USERNAME);
dataSource.setPassword(PASSWORD);
dataSource.setDriverClassName(JDBC_DRIVER);
String url = "jdbc:mysql://localhost:3306/" + testDbName;
dataSource.setUrl(url);
DatabaseDataSourceConnectionFactoryBean dbConnectionFactory = new DatabaseDataSourceConnectionFactoryBean(
dataSource);
dbConnectionFactory.setDatabaseConfig(bean);
return dbConnectionFactory;
}
}
但是,当我运行任何子测试类时,此配置会被忽略(没有打印日志并且实际上没有设置属性)。
当我在子测试类上放@Component注解时使用该配置,但@Component只能使用一次,否则会打印异常:
org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type 'MyBaseTest' available: expected single matching bean but found 2:
FooTest,BarTest
因此我不能在每个子测试类上都添加@Component 注解。
如果将@Component注解放在父测试类上,则不会加载配置。
备注:
每个子测试类使用不同的数据库,使用方法getTestDbName() 检索其名称。我需要这些信息来配置我的数据库连接。
在运行每个子测试类之前加载配置的正确方法是什么?这是 dbunit 将用来加载测试数据集的配置。
【问题讨论】:
-
检查扫描包配置
-
项目的主类有注释
@ComponentScan(basePackages = { "a.b.c.mypackage.*" }),它应该加载MyBaseTest类。 -
错误显示您创建了 2 个具有相同对象名称的 bean。更改一个 bean 的对象名称
-
在每个子测试类上添加@Component注解时,父类的同一个配置bean被加载了两次,导致错误。但是我可能需要加载配置两次。
标签: java spring configuration spring-annotations dbunit