使用存储在属性文件中的查询测试 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
.
的方式相同
我正在为 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
.