【问题标题】:How to unit test Clob conversion to String?如何对 Clob 转换为字符串进行单元测试?
【发布时间】:2015-04-27 17:45:21
【问题描述】:

这个简单的方法将从数据库中检索到的Clob 的所有内容返回为String

如何正确测试/模拟它,确保它始终返回 Clob 参数的完整内容(假设它的大小不会大于整数)?

import java.sql.Clob;

public class ClobUtils {

    public static String clobToString(Clob clob) throws Exception {

        if(clob.length() > Integer.MAX_VALUE) {
            throw new Exception("Clob is too big to be handled by the application.");
        }

        // Assumes that Clob content can fit in the String
        return clob.getSubString(1, Long.valueOf(clob.length()).intValue());
    }

}

【问题讨论】:

  • 我现在可以告诉你,你不能保证它,因为如果 clob.length() 大于 Integer.MAX_VALUE,你的代码将会失败
  • @ControlAltDel 好眼力。我会调查的。
  • @ControlAltDel 我们有一个约束,其中 XML 永远不会接近那个大小,但你的观点是有效的,所以我添加了应该修复逻辑的约束。我现在如何模拟那个 Clob?
  • 有一种更简单的方法可以将 long 转换为 int (int)clob.length()
  • 实现一个 Clob 并将其传递给方法。

标签: java unit-testing junit mocking


【解决方案1】:

您不必测试getSubStringlength。 Sun 和您的数据库提供商的人员已经对其进行了测试。您应该测试的是您是否正确使用它们。显然你不能通过模拟 clob 来做到这一点,因为你不会测试任何东西,或者你必须实现自己的 jdbc 部分(因此你会测试错误的实现)。

你应该做的是做集成测试。设置您的数据库,用已知数据填充它,运行 ClobUtils 并检查它是否返回预期的字符串。是的,设置良好的自动化集成测试并不简单,也不是很容易,但通过合理的努力是可行的。

【讨论】:

  • 我不是要测试 API,你是对的。我的实现应该使用 Clob 进行测试。你知道有什么框架可以帮助我做到这一点吗?喜欢 JOOQ 还是 DbUnit?我已经为 Clob 实现了 Mock 类。如果它遵循规范,它不集成应该没关系,但测试看起来很丑。
  • 这就是为什么你不应该嘲笑它。该模拟没有给您任何帮助,因为您不知道它是否正确实施,并且您的数据库供应商是否对 clob 有任何怪癖。关于工具:我们退出 dbunit 并使用并使用我们的生产 ORM(休眠)在测试中构建与在生产中完全相同的数据库。我们做了自己的包装器来清理测试之间的数据库
  • 就项目结构而言,我们现在买不起真正的数据库。我已经在内存中配置了 H2,它在 Oracle 模式下运行良好。现在应该可以解决问题了。
猜你喜欢
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 2014-12-27
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多