端到端Spring批处理作业的测试用例

时间:2015-11-30 12:38:16

标签: mockito integration-testing spring-batch concordion springmockito

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

<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配置本身(Injecting Mockito mocks into a Spring bean)中创建模拟对象。我不确定的是,如果我使用spring配置它们,我将如何模拟方法调用模拟bean。

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

我不确定我是否可以清楚地解释我的情景。如果您对弹簧批作业的E2E流程测试有任何其他更好的意见,请提出建议,如果您能对上述方法有任何明确的建议,那么请提供帮助。

1 个答案:

答案 0 :(得分:1)

你的方法似乎对我有用。我已多次使用类似的设置。只需从测试中设置Spring上下文,然后使用JobLauncherTestUtils处理您的工作。

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

关于你的嘲笑的设置...... 您可以简单地将您的模拟自动装配到测试中。

@Autowired
private Dao mockedDao;

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

when(dao.findById(any())).thenReturn(something);