为什么 bean 没有被注入到测试类中

Arv*_*ind 1 java testng spring spring-boot spring-boot-test

我有一个 jar 将包含在 spring boot 应用程序中,我正在尝试在此进行集成测试,该项目具有用于创建数据源和 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

道类

 @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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

测试班

@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);
    }

}
Run Code Online (Sandbox Code Playgroud)

测试属性里面

environment=test

#Access management db details
accessmngmt.database.url=//xxyyy/am
accessmngmt.database.username=user
accessmngmt.database.password=password
Run Code Online (Sandbox Code Playgroud)

小智 5

在测试类中,您错过了@RunWith(SpringRunner.class)配置需要 Spring DI 的单元测试。

查看文档spring 单元测试

为了让单元测试运行批处理作业,框架必须加载作业的 ApplicationContext。使用两个注释来触发:

@RunWith(SpringJUnit4ClassRunner.class):表示该类应该使用Spring的JUnit工具

@ContextConfiguration(locations = {...}):指示哪些 XML 文件包含 ApplicationContext。

请注意,SpringRunner 是 SpringJUnit4ClassRunner 的别名。所以我们可以用更短的名字@RunWith(SpringRunner.class)代替@RunWith(SpringJUnit4ClassRunner.class)

更新:

对于数据源属性注入,@EnableConfigurationProperties 注解应该在Test类上进行注解。

此外,您accessmngmt.datasourceDatabaseAccesManagementConfig课堂上使用,而前缀accessmngmt.databaseapplication-test.properties. 在这里你必须统一它们,这样你才能将属性注入到 bean 中。