首页 > 解决方案 > 为什么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

标签: javaspringspring-boottestngspring-boot-test

解决方案


在测试类中,您错过了@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.datasourceDatabaseAccesManagementConfig类中使用,而前缀accessmngmt.databaseapplication-test.properties. 在这里您必须将它们统一起来,以便您可以将属性注入到 bean 中。


推荐阅读