java – 用数据填充ResultSet的简单方法

我想模拟一个ResultSet。认真。
我正在重构一个复杂的代码,它是从ResultSet解析数据,我希望我的代码行为相同。所以,我需要为被重构的部分写一个单元测试以便能够测试。

谷歌搜索后,我想出了两个想法:

>使用EasyMock,写出不方便的嘲弄顺序。 VERY BAD解决方案:难以添加初始数据,难以更改数据,大测试调试许可。
>使用Apache Derby或HSQLDB创建内存数据库,从文件或String数组中填充,并使用一些神奇的InMemoryDBUtils.query(sql)进行查询。然后使用该ResultSet。不幸的是,我没有发现任何神奇的InMemoryDBUtils快速写入测试:-)。 IBM文章“使用Derby进行持久化的隔离单元测试”似乎对我需要的很好,尽管…

第二种方法看起来容易一些,可以支持更多。

你会怎么建议这样一个模拟? (尽管医生,当然:-)?我错过了眉毛一些银子弹吗?可能,DBUnit是这个工具吗?

据我所知,DBUnit不会显示一个结果集,尽管它可以帮助您填充内存数据库。

在这一点上,我会说一个嘲弄的框架是错误的。模拟是关于测试行为和交互,而不仅仅是返回数据,所以它可能会在你的方式。

我会改为实现一个结果集接口,或者创建一个结果集接口的动态代理,实现你所关心的方法,而不必实现整个结果集。您可能会发现维护类保持内存数据库一样简单(只要被测数据集一致),并且可能更容易调试。

您可以使用DBUnit备份该类,您可以使用dbunit对结果集进行快照,并在xml的测试期间将dbunit读回,并使您的哑结果集读取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));
}
http://stackoverflow.com/questions/878848/easy-way-to-fill-up-resultset-with-data

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 用数据填充ResultSet的简单方法