使用PowerMock-easymock模拟db对象

时间:2013-07-19 20:44:07

标签: java unit-testing mocking

我有一个Interface 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 Object测试我实现的DAO类。我通过POWERMOCK / EASYMOCK文档搜索但我猜大多数API 方法为我提供了为DAO接口提供虚拟实现类的对象。

  1. 在某种程度上我可以创建CONNECTION的模拟对象(假设我没有物理数据库访问权限)并且可以运行我的ShoppingListDAOImpl类中提供的后续代码 因为我必须使用这个模拟CODE COVERAGE目的吗?

  2. 如果有任何方法可以让callableStatement.execute()返回虚拟数据或异常(带有物理数据库访问权限)以便我可以检查它 我的JUnit测试用例?

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

1 个答案:

答案 0 :(得分:0)

使用像EasyMock,Powermock或Mockito这样的模拟框架,你可以模拟一切。但我不建议嘲笑Connection

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

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