我正在使用一个应用程序,我正在使用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流程测试有任何其他更好的意见,请提出建议,如果您能对上述方法有任何明确的建议,那么请提供帮助。
答案 0 :(得分:1)
你的方法似乎对我有用。我已多次使用类似的设置。只需从测试中设置Spring上下文,然后使用JobLauncherTestUtils处理您的工作。
要考虑的一件事是嘲笑。如果多个连续步骤从同一数据源读取和写入相同的数据,那么模拟这些数据可能会导致测试中的大量模拟配置。也许为这些步骤设置内存数据库会更容易。这取决于您的实施细节。
关于你的嘲笑的设置...... 您可以简单地将您的模拟自动装配到测试中。
@Autowired
private Dao mockedDao;
然后你可以像任何模拟一样简单地配置模拟。
when(dao.findById(any())).thenReturn(something);