使用存储在属性文件中的查询测试 Dao 层

Test Dao layer with queries stored in properties file

我正在为 IT 课程开发 REST 应用程序。其中一项要求是使用 Spring-JDBC 并将所有查询存储在单独的属性文件中。这是我的 UserDaoImpl 的一部分:

@Repository
@RequiredArgsConstructor
@PropertySource(value = "classpath:/user_queries.properties")
@Log
public class UserDaoImpl implements UserDao {
    
    private final NamedParameterJdbcTemplate template;
    private final RowMapper<User> rowMapper;
    
    @Value("${find.by_id}")
    private String findById;

    @Override
    public Optional<User> findById(int id) {
        SqlParameterSource param = new MapSqlParameterSource("id", id);
        User user = null;
        try {
            user = template.queryForObject(findById, param, BeanPropertyRowMapper.newInstance(User.class));
        } catch (DataAccessException ex) {
            String.format("User with id - %d, not found.", id);
        }
        return Optional.ofNullable(user);
    }
    
}

所有方法都可以正常工作,但是当我为此编写测试时出现问题 class:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestDBConfiguration.class})
public class UserDaoTest {
    
    @Autowired
    DataSource dataSource;
    
    @Test
    public void findByIdTest() {
        NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(dataSource);
        UserRowMapper userMapper = new UserRowMapper();
        UserDao userDao = new UserDaoImpl(template, userMapper);
        User user = new User(1, "John", "Doe",
                "a$MzVXtd4o0y4DOlyHMMLMDeE4/eezrsT5Xad.2lmGr/NkCpwBgvn3e",
                "jdoe@gmail.com", true);
        assertEquals(Optional.of(user), userDao.findById(1));
    }

}

当我 运行 这个测试时,我的 findById 总是空的。有什么方法可以 运行 此测试并将所有查询保存在单独的文件中吗?

由于您的 UserDaoImpl 使用 Spring 注释(@Value@PropertySource 等),您必须通过 Spring 对其进行初始化以启用它们的注入.否则您必须自己手动提供所有这些值。

所以在你的测试中你应该注入 DAO 本身:

@Autowired
private UserDao userDao;

或者,如果您想采用手动方式(不推荐),允许通过构造函数(推荐)设置字段 findById,与传递 template, userMapper.

的方式相同