0

我有一个界面 ShoppingListDAO 如下。

public interface ShoppingListDAO extends GenericDAO<Object, String> {       
    public List<ShoppingList> getShoppingList(Department department) throws ShoppingListDAOException;
}

它的实现 DAO 类类似于下面的一个。

 public  class ShoppingListDAOImpl extends GenericCustomDAO<Object, String> implements ShoppingListDAO {
    //.......
    public  List<ShoppingList> getShoppingList(Department department)  throws ShoppingListDAOException {

    try {               
        ds = getDataSource();
        connection = ds.getConnection();

        callableStatment = connection.prepareCall(SHOPPING_LIST_QRY1);  
        callableStatment.setString(1, department.getDistributorNumber());
        //......    
        callableStatment.registerOutParameter(4, OracleTypes.CURSOR);

        callableStatment.execute();
        resultSet= (ResultSet) callableStatment.getObject(4);

        while(resultSet.next()) {
            //.......
        }           
    } catch (SQLException e) {          
        e.printStackTrace();
        throw new ShoppingListDAOException(e);
    } catch (Exception e) {         
        e.printStackTrace();
        throw new ShoppingListDAOException(e);
    }finally{
        //......                
    }   
}

    return shoppingList;
}

现在我需要使用 Mock db Objects 测试我实现的 DAO 类。我搜索了 POWERMOCK/EASYMOCK 文档,但我猜大多数 API 方法都为我提供了对象,这些对象为我提供了 DAO 接口的虚拟实现类。

  1. 是否有某种方法可以创建 CONNECTION 的模拟对象(假设我没有物理数据库访问权限)并且可以运行我的ShoppingListDAOImpl班级中提供的后续代码,因为我必须将此模拟用于代码覆盖目的?

  2. 如果有什么方法我可以callableStatement.execute()返回虚拟数据或异常(没有物理数据库访问),以便我可以在我的 JUnit 测试用例中检查它?

我对模拟框架很陌生,所以我的要求可能不切实际。任何信息都有帮助。

4

1 回答 1

0

使用 EasyMock、Powermock 或 Mockito 等模拟框架,您可以模拟所有内容。但我不建议嘲笑Connection.

在你的情况下,我会使用像HSQLDB这样的内存数据库来测试你的 DAO 对一个真正的数据库,但一个在内存中运行的数据库。这样,您的测试不依赖于任何外部资源,并且可以轻松地在任何环境中运行。

通过针对数据库测试您的代码,您不再严格地对其进行单元测试。虽然我认为这是一个可以接受的权衡。

于 2013-07-19T20:54:47.203 回答