java - 为什么bean没有注入测试类
问题描述
我有一个将包含在 Spring Boot 应用程序中的 jar,我正在尝试在其中进行集成测试,该项目具有用于创建数据源和 JDBC 模板的配置类,我正在使用测试,
当此 jar 包含在另一个项目中,该项目完美地获取数据但不在同一个项目中时,此项目中没有应用程序类
spring-boot-starter-test 添加为依赖项
配置
@Configuration
public class DatabaseAccesManagementConfig {
@Bean(name = "accessmngmtDataSource")
@Qualifier("accessmngmtDataSource")
@ConfigurationProperties(prefix = "accessmngmt.datasource")
public DataSource accessmngmtDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "accessmngmtJdbcTemplate")
@Qualifier("accessmngmtJdbcTemplate")
public JdbcTemplate accessmngmtJdbcTemplate(@Qualifier("accessmngmtDataSource") DataSource accessmngmtDataSource) {
return new JdbcTemplate(accessmngmtDataSource);
}
}
道类
@Repository
public class ResourcePrivilegesDao {
static final Logger log = LoggerFactory.getLogger(ResourcePrivilegesDao.class);
@Autowired
@Qualifier("accessmngmtJdbcTemplate")
private JdbcTemplate jdbcTemplate;
public List<RP> getAll() {
log.debug("entering getAll()");
String sql = "SELECT * FROM rp";
RowMapper<RP> rowMapper = new RPRowMapper();
List<RP> result = this.jdbcTemplate.query(sql, rowMapper);
return result;
}
}
测试班
@SpringBootTest
@TestPropertySource(locations="classpath:application-test.properties")
@ContextConfiguration(classes = DatabaseAccesManagementConfig.class)
public class ResourcePrivilegesDaoTest {
@Autowired
DatabaseAccesManagementConfig databaseAccesManagement;
@Autowired
ResourcePrivilegesDao dao;
@Test
public void testGetAll() {
System.out.println(databaseAccesManagement);
List<ResourcePrivileges> list = dao.getAll();
Assert.notNull(list, "No resource privileges found");
Assert.notEmpty(list);
}
}
测试里面的属性
environment=test
#Access management db details
accessmngmt.database.url=//xxyyy/am
accessmngmt.database.username=user
accessmngmt.database.password=password
解决方案
在测试类中,您错过了@RunWith(SpringRunner.class)
配置需要 Spring DI 的单元测试。
查看 doc spring 单元测试
为了让单元测试运行批处理作业,框架必须加载作业的 ApplicationContext。两个注释用于触发此操作:
@RunWith(SpringJUnit4ClassRunner.class):表示该类应该使用 Spring 的 JUnit 设施
@ContextConfiguration(locations = {...}):指示哪些 XML 文件包含 ApplicationContext。
请注意,SpringRunner 是 SpringJUnit4ClassRunner 的别名。所以我们可以用一个更短的名字@RunWith(SpringRunner.class)
来代替。@RunWith(SpringJUnit4ClassRunner.class)
更新:
对于数据源属性注入,@EnableConfigurationProperties
注解应该在 Test 类上注解。
此外,您accessmngmt.datasource
在DatabaseAccesManagementConfig
类中使用,而前缀accessmngmt.database
在application-test.properties
. 在这里您必须将它们统一起来,以便您可以将属性注入到 bean 中。
推荐阅读
- javascript - 如何使用 URL 参数更改使用 reactjs 导入文件的位置?
- python - 在 FiftyOne 中保留/检索评估结果
- aws-cli - 将图像推送到 lightsail 容器注册表的问题
- php - 如何在PHP中对数组中返回的项目进行分组
- aws-lambda - 无法删除由 Cloud Formation 创建的 Lambda@Edge
- c# - 表达式 'c => c.Coords.Latitude' 不是有效的属性表达式
- javascript - 导致此错误的原因 - 对象作为 React 子项无效(找到:带有键 {id, task} 的对象)
- bitcoinj - 坚持配置比特币核心构建
- centos8 - 有人知道如何在 Centos8 上安装 `moreutils` 吗?
- c# - 在 C# 中从十进制转换时,双精度会丢失吗?