【问题标题】:How do I create an instance of RecordN manually in JOOQ?如何在 JOOQ 中手动创建 RecordN 的实例?
【发布时间】:2015-04-19 02:53:32
【问题描述】:

我正在为将数据导入数据库的脚本编写一些测试。脚本的单元测试看起来或多或少像

doAnImport(fileName, databaseToImportInto)
Result<Record2<String, Integer>> results 
    = databaseToImportInto.select(aStringField, anIntegerField)
                          .from(oneTable)
                          .join(anotherTable).on(someField.eq(someOtherField)
                          .fetch();

我现在想做的是 Junit 断言之类的

assertEquals(10, results.getSize());
assertTrue(results.contains(new Record2<String, Integer>(expectedString1, expectedInteger1);
...
assertTrue(results.contains(new Record2<String, Integer>(expectedString10, expectedInteger10);

因为我不想在结果中假设任何特定的顺序。我的问题是 Record2 是一个接口,RecordImpl 不是公开可见的。

我可以看到的其他选项(将测试查询变成一个视图并为其生成类,以便有一个 XXXRecord 实现)对我来说并不真正可用 - 这些查询的数量很大并且在不断增长,而我没有想将我的数据库架构与我的测试用例的特性联系起来。

我想我可以创建自己的 RecordImpl 子类,但这似乎需要做很多工作,所以我猜考虑到库其余部分的优雅(如果你还没有尝试过,你真的应该) ,这不是“正确的事情”。

任何帮助将不胜感激。

【问题讨论】:

    标签: java sql testing jooq


    【解决方案1】:

    我认为实现这一目标的最简单方法是:

    assertEquals(new HashSet<>(result1), new HashSet<>(result2));
    

    这将比较两个Result 对象,忽略记录顺序。这就是您创建临时记录的方式:

    Record record = DSL.using(...).newRecord(result1.fields());
    

    但实际上可能还有改进 API 的空间。

    【讨论】:

    • 谢谢卢卡斯。这比我想出的要简单:)
    • 实际上,进一步考虑,我不确定它是否更简单。您使用 DSL.newRecord() 的方法需要逐个字段调用 setValue,而 DSL.row() 方法允许 DSL.row("val1", 10, fasle, 10.6) 所以它可能是一种更简单的方法测试站点,创建这些值的地方。因为这是最常见的事情(我只需要写一次看起来像,但我称之为大量且不断增长的次数)我认为我的方法更简单。但我没有意识到我可以 HashSet 结果 - 这是一个很酷的技巧。
    • @BurleighBear:这就是我所说的“但可能还有改进 API 的空间”。可能有Row.record() 或类似的东西......
    【解决方案2】:

    啊。我在查看其他文档时找到了答案。

    DSL.row()
    

    将返回 RowN 的实现,然后您可以使用它与结果进行比较,通过调用

    Record.valuesRow() 
    

    关于结果中的值。

    为了记录,我用于测试的实用函数现在看起来像这样

    public static void looksLike(boolean matchSize, Result<?> results, Row ... theseRows)
    {
        if (matchSize)
        {
            assertEquals(results.size(), theseRows.length);
        }
    
        List<Row> resultsRows = new ArrayList<Row>();
        for (Record r : results)
        {
            resultsRows.add(r.valuesRow());
        }
    
        for (Row r : theseRows)
        {
            assertTrue(r.toString() + " missing from " + results, resultsRows.contains(r));
        }
    }
    

    正如我所说,我在问题中认为,确实有一种简单的方法可以做我想做的事。 JOOQ 框中的另一个勾号。

    【讨论】:

      猜你喜欢
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      相关资源
      最近更新 更多