我想知道在 Spring Batch 作业中测试以下场景的最佳方法是什么:
- 包含两个步骤的作业:
1) 第一步使用ItemReader
( from apache kudu using impala
) 从数据库中读取数据并将查询生成的内容写入文件。
- 这
itemReader
有一个rowMapper
从结果集中创建一个复杂对象的方法。它itemWriter
只是制作了一个toString (which in fact is a JSON representation)
复杂的对象。
2)第二步从生成的文件中读取step 1
并处理。处理完所有文件后,所有内容都写入一个新文件。
- 使用a
itemReader
读取文件,然后处理从映射器生成的新复杂对象并将它们写入新文件。step 1
jsonLineMapper
然后作业的侦听器将这两个文件上传到 S3。
我需要这个工作流程,因为第一步会生成第二步所需的样本。如果有一天我只需要测试第二步,我可以使用第一步中的旧样本,因为数据库会随着时间而变化,如果没有它,我可能无法生成两天前执行的相同样本。
第一步是最难测试的,但我想以如下方式测试这两个步骤:
1)step 1
我需要检查查询语法是否正确。另外,检查从数据库结果集中它是否通过rowMapper
. 文件的内容itemWriter
是正确的(correct means that is expected)
。
2)第二步更容易测试,因为我可以从预定义的文件开始。它应该测试使用从文件读取jsonLineMapper
是否正确完成。处理部分是分开测试的,但我可以遵循一个简单的工作流程,最终文件具有预期的内容。
我测试该场景的想法是:
1)为了检查查询语法是否正确,我需要一个查询构建器(我用谷歌搜索并找到了类似的库,jOOQ
但我不想添加外部库只是为了构建字符串查询)。在检查查询是否正确之后,也许我应该mock
数据库并返回一个预定义的复杂对象并将其写入文件。问题是,如果查询返回缺少的列,则该对象将不正确,并且测试应该失败,所以如果我返回一个预定义的对象,我将永远不知道哪个是查询返回。
正如您在此处看到的那样,问题出现在验证查询中,就好像查询是正确的一样,我可以测试rowMapper
最终文件。
2) 对于这一步,我认为最好的方法是拥有一个包含正确内容的预定义文件,step 1
然后检查最终文件内容是否符合我的预期。我认为这一步很容易测试。
测试这种情况的任何更好的方法或方法?
谢谢!