2012-10-30 227 views
4

在弹簧批量作业中测试以下场景的方法是什么?单元测试弹簧批量作业

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

2)作业由几个步骤组成,其中一些步骤具有itemreader,itemprocessor,itemwriters,而一些步骤具有tasklet。

3)一个itemreader,其中对item读取器的输入查询是一个非常复杂的sql查询,它有很多表的连接 - 这个场景不允许清空所有使用的表,并用伪数据填充它们进行测试。换句话说,可能存在真实世界的场景,在这些场景中,无法清空表格进行测试。在这种情况下应该采取什么方法?

如果我在这个论坛上获得一些关于应采取的方法的帮助,我想准备一个示例套件,其中包含用于测试具有不同作业场景的弹簧批作业的示例。

+0

在一般说明中:确保您最终不会编写有效测试数据库或Spring Batch的测试。这意味着您可以使用下面的技术(即使用HSQLDB)来模拟数据库及其表格。这可以使用内存数据库来完成,因此比使用真实数据库要快很多倍。 – Fortyrunner

回答

6

这是非常困难的“单元”测试弹簧批处理作业,纯粹是因为有与外部资源,如数据库或文件等的方法,我有这么多的互动有两个层次:

的各个方法在tasklets中单元测试正常,我只是直接从JUnit测试中调用方法,通常使用mock或stub。

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

这有几个优点一种工作方式。

  1. 我可以从Eclipse运行这些测试,因此缩短调试周期,因为我不需要每次构建完整的包来测试它。
  2. 他们很容易创建,我只是将它们包含在maven中的故障安全插件中。

与一对夫妇的警告:

你需要运行一个安全管理器内的主要方法。如果你的主要调用System.exit(),你不想让JVM停下来。有关SecurityManager的示例,请参阅org.junit.tests.running.core.MainRunner。这就是所谓的喜欢:

Integer exitValue = new MainRunner().runWithCheckForSystemExit(new Runnable() { 
    public void run() { 
    Main.main(new String[] {}); 
    } 
}); 

使用上面,你可以断言,一批与失败的正确值调用System.exit(),允许失败条件测试,以及。其次,你可以从JUnit测试中做很多设置,但是你不能做所有事情,所以如果你需要一个FTP服务器,我通常从maven启动它,而不是JUnit,之前故障安全插件运行。有时候这可能有点烦琐。

+1

感谢您的详细输入......我也正在浏览http://blogs.justenougharchitecture.com/?p=124和http://keyholesoftware.wordpress.com/2012/02/23/spring-batch-unit -testing - 和 - 的Mockito / – Nik