据我所知,DBUnit 不提供结果集,尽管它可以很好地帮助您填充内存数据库。
我会说在这一点上模拟框架是错误的方法。模拟是关于测试行为和交互,而不仅仅是返回数据,所以它可能会妨碍你。
相反,我要么实现结果集接口,要么创建结果集接口的动态代理到实现您关心的方法的类,而不必实现整个结果集。您可能会发现维护一个类就像维护一个内存数据库一样容易(假设被测数据集是一致的),并且可能更容易调试。
您可以使用 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));
}