gpt4 book ai didi

junit - 单元测试 Spring 批处理作业

转载 作者:行者123 更新时间:2023-12-04 23:59:04 24 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

小任务中的各个方法都像往常一样进行了单元测试,我只是直接从 JUnit 测试中调用这些方法,使用通常的模拟或 stub 。

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

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

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

  • 有几个警告:

    您需要在 SecurityManager 中运行 main 方法。如果您的主要调用 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 启动它.有时这可能有点繁琐。

    关于junit - 单元测试 Spring 批处理作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13135909/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com