当前位置: 首页 > 面试题库 >

用数据填充ResultSet的简单方法

裴承安
2023-03-14
问题内容

我想模拟一个ResultSet。说真的
我正在重构一个大的复杂代码段,该代码段是从ResultSet中解析数据,并且我希望代码的行为相同。因此,我需要为要重构的部分编写一个单元测试,以便能够对此进行测试。

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

  1. 使用EasyMock,编写looooong模拟序列。非常糟糕的解决方案:难以添加初始数据,难以更改数据,测试调试程序繁琐。
  2. 使用Apache Derby或HSQLDB创建内存数据库,从文件或字符串数​​组填充它,并使用一些神奇的InMemoryDBUtils.query(sql)进行查询。然后使用该ResultSet。不幸的是,我没有发现任何神奇的InMemoryDBUtils可以快速编写测试:-)。IBM的文章“使用Derby对持久性进行隔离的单元测试”对于我需要的东西似乎还不错,但是…

第二种方法看起来更容易,也更受支持。

对于创建这样的模拟游戏,您有何建议?(当然,尽管有医生:-)?我 在眉毛上想 些银子吗?DBUnit可能是用于此的工具吗?


问题答案:

据我所知,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));
}


 类似资料:
  • 问题内容: 我整天用谷歌搜索,没有运气。我按确定按钮后调用方法。所以代码是: 我的testResultSet()方法工作正常。现在,如何改变我的代码,以便它工作,或者什么是最简单的代码,以使DefaultTableModel从ResultSet?提前致谢。 编辑:我正在接收java.lang.IllegalStateException: SQLite JDBC: inconsistent inte

  • series(string $value,[ string $categories]) string $value $config = ['path' => './tests']; ​ $fileObject = new \Vtiful\Kernel\Excel($config); ​ $fileObject = $fileObject->fileName('tutorial.xlsx'); $

  • factory 辅助函数 必须 使用 factory 方法来做数据填充,因为是框架提倡的,并且可以同时为测试代码服务。 运行效率 开发数据填充时,必须 特别注意 php artisan db:seed 的运行效率,否则随着项目的代码量越来越大,db:seed 的运行时间会变得越来越长,有些项目多达几分钟甚至几十分钟。 原则是: Keep it lighting speed. 只有当 db:seed

  • 问题内容: 我打算根据其他下拉菜单的选择使用AJAX填充下拉框。我遵循了使用位于此处的jQuery的教程-http: //remysharp.com/2007/01/20/auto-populating-select-boxes-using-jquery- ajax/ ,并在选择框名称中更改了选择框ID名称。在脚本中。 当主复选框的值发生更改时,将发送ajax并返回如下: 这与教程代码中返回的JS

  • 简介 Laravel 可以用 seed 类轻松地为数据库填充测试数据。所有的 seed 类都存放在 database/seeds 目录下。你可以任意为 seed 类命名,但是更应该遵守类似 UsersTableSeeder 的命名规范。Laravel 默认定义的一个 DatabaseSeeder 类。可以在这个类中使用 call 方法来运行其它的 seed 类从而控制数据填充的顺序。 编写 See

  • 问题内容: 我有一个带有表,组合框的框架,我想通过组合框用数据库中的数据填充表,但是如果我与itemlistener一起使用,我不会看到没有itemlistener的表,然后我会看到包含数据的表(combob = combobox) 问题答案: 您有几个问题: 您使用不正确。您的代码可能可以运行(我不确定),但是它没有利用的功能。 从ResultSet读取数据的代码没有意义,因为您甚至根本没有从R