据我所知,DBUnit并不提供结果集,但它可以帮助您填充内存数据库。
我认为使用mocking框架是错误的方法。Mocking是关于测试行为和交互,而不仅仅是返回数据,因此它可能会妨碍您。
相反,我建议实现一个结果集接口,或者创建一个结果集接口的动态代理,指向一个只实现您关心的方法而无需实现整个结果集的类。您可能会发现维护一个类就像维护一个内存数据库一样容易(前提是测试数据集是一致的),并且可能更容易调试。
如果数据稍微复杂,您可以用DBUnit来支持这个类,在测试期间使用dbunit获取结果集的快照,然后让dbunit从xml中读取数据,并让您的虚拟结果集从dbunit的类中读取数据。这是一个合理的方法。
如果这些类之间的耦合性很强,需要读取在同一测试中修改的数据,则应使用内存数据库。即使如此,我也会考虑使用真实数据库的副本,直到您成功解除该依赖项。
一个简单的代理生成方法:
private static class SimpleInvocationHandler implements InvocationHandler {
private Object invokee;
public SimpleInvocationHandler(Object invokee) {
this.invokee = invokee;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
method = invokee.getClass().getMethod(method.getName(), method.getParameterTypes());
if (!method.isAccessible()) {
method.setAccessible(true);
}
try {
return method.invoke(invokee, args);
} catch (InvocationTargetException e) {
throw e.getTargetException();
}
}
}
public static <T> T generateProxy(Object realObject, Class... interfaces) {
return (T) Proxy.newProxyInstance(realObject.getClass().getClassLoader(), interfaces, new SimpleInvocationHandler(realObject));
}