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

Java 如何在JOOQ中手动创建RecordN的实例?,java,sql,testing,jooq,Java,Sql,Testing,Jooq,我正在为将数据导入数据库的脚本编写一些测试。脚本的单元测试看起来或多或少像 doAnImport(fileName, databaseToImportInto) Result<Record2<String, Integer>> results = databaseToImportInto.select(aStringField, anIntegerField) .from(oneTable)

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

doAnImport(fileName, databaseToImportInto)
Result<Record2<String, Integer>> results 
    = databaseToImportInto.select(aStringField, anIntegerField)
                          .from(oneTable)
                          .join(anotherTable).on(someField.eq(someOtherField)
                          .fetch();
doAnImport(文件名,数据库导入)
结果
=数据库导入。选择(aStringField,IntegerField)
.从(一表)
.join(另一个表).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);
assertEquals(10,results.getSize());
assertTrue(results.contains)(新记录2(expectedString1,expectedInteger1);
...
assertTrue(results.contains)(新记录2(expectedString10,expectedInteger10);
因为我不想在结果中假设任何特定的顺序。我的问题是Record2是一个接口,而RecordImpl不公开可见

我可以看到的其他选项(将测试查询制作成视图并为其生成类,以便有一个XXXRecord实现)对我来说并不是真的可用——这些查询数量庞大且不断增长,我不想将我的数据库模式与我的测试用例的特性联系起来

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


任何帮助都将不胜感激。

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

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));
    }
}
publicstaticvoidlookslike(布尔匹配大小、结果、行…行)
{
如果(匹配大小)
{
assertEquals(results.size(),theserrows.length);
}
List resultsRows=新建ArrayList();
记录(r:结果)
{
resultsRows.add(r.valuesRow());
}
对于(r行:这些行)
{
assertTrue(r.toString()+“缺少”+结果,resultsRows.contains(r));
}
}

正如我在问题中所说的,我认为确实有一种简单的方法可以实现我想要的。在JOOQ框中再打一个勾。

实现这一点的最简单方法是:

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

但实际上,可能还有改进API的余地。

谢谢Lukas。这比我提出的更简单:)事实上,进一步考虑,我不确定它是否更简单。使用DSL.newRecord()的方法需要对setValue进行逐字段调用,而DSL.row()方法允许DSL.row(“val1”,10,fasle,10.6)因此,在创建这些值的测试站点,这可能是一种更简单的方法。因为这是最常见的事情(我只需要编写一次,但我称之为大量且不断增加的次数)我认为我的方法更简单。但我没有意识到我可以设置结果-这是一个很酷的把戏。@BurleighBear:这就是我所说的“但可能还有改进API的空间”。可能有
Row.record()
或类似的东西。。。
Record record = DSL.using(...).newRecord(result1.fields());