Junit 单元测试spring批处理作业

Junit 单元测试spring批处理作业,junit,spring-batch,Junit,Spring Batch,在Spring批处理作业中测试以下场景的方法是什么: 1) 在spring批处理作业的步骤中运行的独立tasklet 2) 一种由多个步骤组成的作业,其中一些步骤有itemreader、itemprocessor、ItemWriter,而一些步骤有Tasklet 3) itemreader,其中对item reader的输入查询是一个非常复杂的sql查询,具有来自多个表的联接-此场景不允许清空所有使用的表并使用虚拟数据填充它们以进行测试。换句话说,可能存在现实世界中无法清空表进行测试的场景。在这

在Spring批处理作业中测试以下场景的方法是什么:

1) 在spring批处理作业的步骤中运行的独立tasklet

2) 一种由多个步骤组成的作业,其中一些步骤有itemreader、itemprocessor、ItemWriter,而一些步骤有Tasklet

3) itemreader,其中对item reader的输入查询是一个非常复杂的sql查询,具有来自多个表的联接-此场景不允许清空所有使用的表并使用虚拟数据填充它们以进行测试。换句话说,可能存在现实世界中无法清空表进行测试的场景。在这种情况下,应该采取什么方法


如果我在这个论坛上得到一些关于所采取方法的帮助,我想准备一个示例套件,其中包含使用不同作业场景测试spring批处理作业的示例

很难对spring批处理作业进行“单元”测试,纯粹是因为与外部资源(如数据库或文件等)的交互太多。我采用的方法有两个层次:

Tasklet中的各个方法都是按常规进行单元测试的,我只是直接从JUnit测试中调用这些方法,使用通常的mock或stub

其次,我从JUnit测试运行批处理,直接调用main方法,并准备好所有必要的基础设施。对于批处理作业,我需要一个数据库和一些输入文件。我的JUnit测试将该测试所需的所有文件复制到一个临时目录(我使用maven,所以通常是
target/it
),以及一个数据库(我的MySQL数据库的副本以HSQLDB格式保存)。然后我用正确的参数直接调用
Main.Main()
,让批处理运行,然后检查结果,检查是否生成了正确的文件,是否正确更改了数据库等

作为一种工作方式,这有两个优点

  • 我可以从Eclipse运行这些测试,因此缩短了调试周期,因为我不需要每次都构建完整的包来测试它
  • 它们很容易整合到构建中,我只是将它们包含在maven的故障保护插件中
  • 有几个警告:

    您需要在SecurityManager中运行main方法。如果main调用System.exit(),则不希望JVM停止。有关SecurityManager的示例,请参阅。这被称为:

    Integer exitValue = new MainRunner().runWithCheckForSystemExit(new Runnable() {
        public void run() {
        Main.main(new String[] {});
      }
    });
    
    使用上述方法,您可以断言批处理在失败时使用正确的值调用System.exit(),并允许测试失败条件


    其次,您可以从JUnit测试中进行大量设置,但无法完成所有设置,因此,例如,如果您需要FTP服务器,我通常在故障保护插件运行之前从maven而不是JUnit启动它。这有时可能有点棘手。

    感谢您的详细输入。。。我还将介绍一个一般性的注意事项:确保您最后编写的测试不是针对数据库或Spring批处理的有效测试。这意味着您可以使用以下技术(即使用HSQLDB)来模拟数据库及其表。这可以使用内存数据库完成,因此比使用真实数据库快很多倍。