我有一个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接口提供虚拟实现类的对象。
在某种程度上我可以创建CONNECTION的模拟对象(假设我没有物理数据库访问权限)并且可以运行我的ShoppingListDAOImpl
类中提供的后续代码
因为我必须使用这个模拟CODE COVERAGE目的吗?
如果有任何方法可以让callableStatement.execute()
返回虚拟数据或异常(带有物理数据库访问权限)以便我可以检查它
我的JUnit测试用例?
我对模拟框架很陌生,所以可能我的要求是不切实际的。任何信息都会有所帮助。
答案 0 :(得分:0)
使用像EasyMock,Powermock或Mockito这样的模拟框架,你可以模拟一切。但我不建议嘲笑Connection
。
在你的情况下,我会使用像HSQLDB这样的内存数据库来测试你的DAO对一个真正的数据库,但是一个在内存中运行的数据库。这样,您的测试不依赖于任何外部资源,并且可以在任何环境中轻松运行。
通过针对数据库测试代码,您不再需要对其进行单元测试。虽然我认为这是一个可以接受的权衡。