Java 如何测试从数据库读取数据并写入文件的spring批处理步骤?

Java 如何测试从数据库读取数据并写入文件的spring批处理步骤?,java,spring,spring-batch,impala,apache-kudu,Java,Spring,Spring Batch,Impala,Apache Kudu,我想知道在Spring批处理作业中测试以下场景的最佳方法是什么: 包含两个步骤的作业: 1) 第一步使用ItemReader(来自apachekudu,使用impala)从数据库读取数据,并将查询生成的内容写入文件 itemReader有一个rowMapper,它从结果集创建一个复杂对象。它的itemWriter只是为这个复杂对象创建了一个toString(实际上是一个JSON表示) 2) 第二步从步骤1生成的文件中读取并处理它。处理完所有文件后,所有内容都会写入一个新文件 itemR

我想知道在Spring批处理作业中测试以下场景的最佳方法是什么:

  • 包含两个步骤的作业:
1) 第一步使用
ItemReader
来自apachekudu,使用impala
)从数据库读取数据,并将查询生成的内容写入文件

  • itemReader
    有一个
    rowMapper
    ,它从结果集创建一个复杂对象。它的
    itemWriter
    只是为这个复杂对象创建了一个
    toString(实际上是一个JSON表示)
2) 第二步从
步骤1生成的文件中读取并处理它。处理完所有文件后,所有内容都会写入一个新文件

  • itemReader
    使用
    jsonLineMapper
    步骤1
    读取文件,然后处理从mapper生成的新复杂对象并将其写入新文件
然后作业的侦听器将这两个文件上传到S3中

我需要这个工作流,因为第一步生成了第二步所需的示例。如果有一天我只需要测试第二步,我可以使用第一步中的一个旧样本,因为数据库会随着时间而变化,如果没有它,我可能无法生成两天前执行的相同样本

第一步是最难测试的一步,但我想以如下方式测试这两个步骤:

1) 从
步骤1
我需要检查查询语法是否正确。此外,请检查是否通过
行映射器从数据库结果集生成正确的对象。
itemWriter
文件的内容是正确的
(正确的意思是预期的)

2) 第二步更容易测试,因为我可以从预定义的文件开始。它应该测试使用
jsonLineMapper
读取文件是否正确。处理部分是分开测试的,但我可以遵循一个简单的工作流程,最终文件具有预期的内容

我测试该场景的想法是:

1) 为了检查查询语法是否正确,我需要一个查询生成器(我在谷歌上搜索并找到了像
jOOQ
这样的库,但我不想仅仅为了构建字符串查询而添加外部库)。检查查询是否正确后,也许我应该
mock
数据库并返回预定义的复杂对象并将其写入文件。问题是,如果查询返回缺少的列,那么对象将不正确,测试应该失败,因此如果我返回预定义的对象,我将永远不知道哪个是查询返回

正如您在这里所看到的,为了验证查询,问题逐渐深入,就好像查询是正确的一样,我可以测试
rowMapper
和最终文件

2) 对于这一步,我认为最好的方法是使用
步骤1
中正确内容的预定义文件,并检查最终文件内容是否符合我的预期。我认为这一步很容易测试

有没有更好的方法来测试这个场景


谢谢

对于步骤1,我建议使用嵌入式数据库插入一些行,运行作业,然后断言生成的文件是正确的。这允许您控制测试数据,以便验证查询和文件中的预期结果。您可以在此处找到一个示例:。Spring批处理提供了测试两个文件是否相等的方法。这可以帮助您根据预期文件验证步骤1的输出


对于步骤2,您可以创建一些有效/无效文件(这些文件可能是步骤1的结果),并将它们用作测试步骤2的输入。但需要注意的是,如果步骤1的结果发生变化,这些文件将不再有效,无法测试步骤2(因此这是您需要注意的维护成本)

谢谢你的回答!问题是,我不能嵌入任何数据库,因为连接表的语法对于PostgreSQL来说与对于Impala来说不同。我使用Impala查询Apache Kudu,但我没有找到任何嵌入Impala和Kudu的方法。事实上,当您无法在嵌入式模式下使用真实数据库或数据库供应商之间的语法不同时,这就是一个问题。您仍然可以使用相同的方法使用真实数据库而不是嵌入式数据库来测试步骤1。这是我在第一个实例中要做的,但我想知道是否有更好的方法,因为如果数据库(测试数据库)关闭,测试将失败。但我想我会试试你的方法,谢谢!您可以使用测试容器在测试之前/之后启动/停止数据库容器。更多详细信息请参见:。这允许您避免“如果测试数据库关闭,测试将失败”的场景。