4

我有一个使用弹簧批处理的应用程序。我想编写一个可以端到端测试批处理作业的测试用例。我一直在探索相同的各种选择。我检查了 concordion 测试用例是否有用,但我不确定它是否是测试 spring-batch 作业的理想方法。到目前为止,我认为集成测试用例应该最适合我的情况。我想知道测试我的场景的理想方法应该是什么。

<batch:job id="batch-job">

    <batch:step id="cleanupData" next="populateExchRates">
        <batch:tasklet ref="dataCleanupTasklet" />
    </batch:step>

    <batch:step id="populateExchRates" next="populateCache">
        <batch:tasklet ref="populateExchRatesDBTasklet" />
    </batch:step>       

     <batch:step id="populateCache" next="ExternalDbQuery">
        <batch:tasklet ref="populateFxRatesCacheTasklet" />
    </batch:step>

    <batch:step id="ExternalDbQuery" next="...">
        <batch:tasklet ref="ExternalDBQueryTasklet" />
    </batch:step>

    ...
</batch:job>

我们有如上所述定义的批处理作业,有 20 多个步骤,包括与外部系统的接口(>5 个这样的步骤),还有步骤阅读器等。

在开发集成测试用例时,我正在考虑使用 spring-batch-test API 和 Mockito,以便我可以模拟涉及外部系统调用的步骤。使用这种方法,我必须在 spring 配置本身中创建模拟对象(将 Mockito 模拟注入 Spring bean)。我不确定的是,如果我使用 spring 配置它们,我将如何模拟模拟 bean 的方法调用,如下所示。

<bean id="dao" class="org.mockito.Mockito" factory-method="mock"> 
      <constructor-arg value="com.package.Dao" /> 
</bean>

我不确定我是否可以清楚地解释我的情况。请建议您是否有任何其他更好的意见来测试 Spring-batch 作业的 E2E 流程,以及您是否可以提供对上述方法有帮助的任何说明。

4

1 回答 1

2

你的方法对我来说似乎有效。我已经多次使用类似的设置。只需从您的测试中设置一个 Spring 上下文并使用 JobLauncherTestUtils 来处理您的作业。

要考虑的一件事是要模拟什么。如果多个连续步骤从同一个数据源读取和写入相同的数据,将它们模拟出来,可能会导致您的测试中出现大量模拟配置。也许为这些步骤设置内存数据库更容易。这取决于您的实施细节。

关于模拟的设置...您可以简单地将模拟自动连接到测试中。

@Autowired
private Dao mockedDao;

然后,您可以像配置任何模拟一样简单地配置该模拟。

when(dao.findById(any())).thenReturn(something);
于 2018-04-25T18:21:29.897 回答