我现在很难写一些测试用例,因为我是TDD的新手。例如,我有这个dao方法,
public Customer getById(Long id) {
if (id < 1L) {
return null;
}
MapSqlParameterSource params = new MapSqlParameterSource("id", id);
return jdbcTemplate.queryForObject("select * from customer where id = :id", params, new RowMapper<Customer>() {
public Customer mapRow(ResultSet rs, int rowNum) throws SQLException {
return createCustomerFromResultSet(rs);
}
});
}
我希望对此进行消极测试。负面测试案例,
@Test
public void getByIdNegative() throws Exception {
Customer customer = customerDao.getById(-1L);
log.debug("Customer retrieved: " + customer);
assertNull(customer);
}
抛出一个异常所以我在dao方法中编写了上面看到的if子句来解决它,但它似乎并不是正确的方法。我应该期待一个例外吗?处理它?如果是这样在哪一层又怎么样?在这种情况下,负面测试是否必要或仅仅是过度杀戮?这些是我现在脑子里的一些问题。我想知道如何按照正确的TDD原则干净地处理这个测试用例。
答案 0 :(得分:2)
好的方法,恕我直言,首先是为你的方法编写javadoc。这是它的规格。
它必须告诉方法做什么,返回和抛出。
lsnrctl stat
指定如果查询不返回一行,则抛出queryForObject()
。
您的方法应该处理数据库中也不存在ID的情况。它可以抛出相同的异常,或抛出另一个异常,或返回null,或返回空IncorrectResultSizeDataAccessException
而不是Optional<Customer>
。这是您的设计选择。
一旦你做出了这个选择,记录下来,并编写验证合同的测试:
显然使用-1进行测试,并为此特定标识符添加特殊情况是错误的。因为-1只是数据库中不存在的大量ID之一。该方法必须不通过测试。该方法必须按照其规范所说的做。