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

时间:2018-12-02 03:11:54

标签: java spring spring-boot testng 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);
        }
    }

道课

 @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

1 个答案:

答案 0 :(得分:1)

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

看看文档spring unit test

  

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

     

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

     

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

注意,SpringRunner是SpringJUnit4ClassRunner的别名。因此,我们可以使用@RunWith(SpringRunner.class)代替名称较短的@RunWith(SpringJUnit4ClassRunner.class)

已更新:

对于数据源属性注入,应该在Test类上注释@EnableConfigurationProperties批注。

此外,您在accessmngmt.datasource类中使用DatabaseAccesManagementConfig,而前缀在accessmngmt.database中与application-test.properties不匹配。在这里,您必须统一它们,以便可以将属性注入Bean。