如何使用Java测试数据访问和SQL语句?

时间:2013-11-24 04:18:32

标签: java mysql spring unit-testing

我有一个利用Spring进行JDBC访问的DAO方法。它计算卖方销售商品的成功率。

以下是代码:

public BigDecimal getSellingSuccessRate(long seller_id) {
    String sql = "SELECT SUM(IF(sold_price IS NOT NULL, 1, 0))/SUM(1) 
                  FROM transaction WHERE seller_id = ?";
    Object[] args = {seller_id};
    return getJdbcTemplate().queryForObject(sql, args, BigDecimal.class);
}

我应该如何使用JUnit测试此方法或任何DAO方法?测试数据访问逻辑有哪些最佳实践?我正在考虑在一个嵌入了一些数据的可嵌入数据库之后进行测试,但是我们不应该在生产环境中进行集成测试吗?

1 个答案:

答案 0 :(得分:1)

我们为单元测试所做的通常是在内存数据库中创建模式并对其运行查询。一些单元测试预先填充其数据以检查查询是否返回预期结果。在简单的情况下,我们只是跳过那部分,只检查查询是否实际运行,没有拼写错误,缺少关系等。

这里可能存在的问题是您的查询可能依赖于供应商特定的方言,这使得它们不能或几乎不可移植。使用像JPA这样的抽象可以避免这些问题。

作为一般规则,避免使用存储过程,触发器或类似物将(任何)逻辑放入数据库层,除非您有充分的理由这样做。保持应用程序中的逻辑使其更加透明,更容易测试。

进行集成测试是个好主意,以便验证应用程序的整体行为。 Spring是一个非常好的集成测试,因此使用Spring引导应用程序应该非常简单。