如何在JOOQ中手动创建RecordN实例?

时间:2015-04-15 23:00:17

标签: java sql testing jooq

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

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子类,但这似乎很多工作,所以考虑到图书馆其他部分的优雅,我猜测(如果你还没试过,你真的应该),这不是&#34;正确的事情&#34;。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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框中的另一个标记。

答案 1 :(得分:1)

我能看到实现这一目标的最简单方法是:

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

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

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

但确实有改进API的空间。