我正在为将数据导入数据库的脚本编写一些测试。单元测试脚本看起来或多或少像
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;。
非常感谢任何帮助。
答案 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的空间。