为我的DAO编写测试用例的最佳TDD方法是什么?

时间:2016-11-09 14:27:18

标签: java spring spring-boot tdd

我现在很难写一些测试用例,因为我是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原则干净地处理这个测试用例。

1 个答案:

答案 0 :(得分:2)

好的方法,恕我直言,首先是为你的方法编写javadoc。这是它的规格。

它必须告诉方法做什么,返回和抛出。

lsnrctl stat 指定如果查询不返回一行,则抛出queryForObject()

您的方法应该处理数据库中也不存在ID的情况。它可以抛出相同的异常,或抛出另一个异常,或返回null,或返回空IncorrectResultSizeDataAccessException而不是Optional<Customer>。这是您的设计选择。

一旦你做出了这个选择,记录下来,并编写验证合同的测试:

  1. 获取数据库中存在的客户时,请检查该方法是否确实返回该客户
  2. 获取数据库中不存在的客户时,请检查该方法是否抛出正确的异常,或者返回正确的值,具体取决于您的设计选择。
  3. 显然使用-1进行测试,并为此特定标识符添加特殊情况是错误的。因为-1只是数据库中不存在的大量ID之一。该方法必须不通过测试。该方法必须按照其规范所说的做。