Spring Batch JUnit测试未加载JobLauncherTestUtils的application.properties

时间:2017-09-25 01:48:40

标签: java spring spring-batch

JdbcJobInstanceDao尝试调用FIND_JOBS_WITH_KEY查询时,问题就出现了问题:

SELECT JOB_INSTANCE_ID, JOB_NAME from %PREFIX%JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?

%PREFIX%令牌替换为application.propertiesspring.batch.table-prefix的值,默认为"BATCH_"

我的小测试证明,应用程序属性肯定是从文件中加载的:

@ActiveProfiles("test") // to load `application-test.properties`
@RunWith(SpringRunner.class)
// we don't need a web context as we are playing with only server side classes
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = {TestDatabaseConfig.class,
        MyBatchProperties.class, SpringBatchTestConfig.class})
@ComponentScan(basePackageClasses = {MyBatchConfig.class}) 
// MyBatchConfig has @EnableBatchProcessing and all job configurations.
public class BatchTest {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @Autowired
    private ApplicationContext applicationContext;

    @Before
    public void setup() {
        Environment environment = applicationContext.getEnvironment();
        System.out.println(environment.getProperty("spring.batch.table-prefix"));
        // above prints MY_SCEHMA_USER.BATCH_ as expected
    }

    @Test
    public void checkJobRuns() {
        try {
            jobLauncherTestUtils.launchJob();
        } catch (Exception e) {
            e.printStackTrace(); // <-- fails here with the query returning "table not found" because the prefix was not configured correctly.
        }
    }
}

application-test.properties

spring.batch.table-prefix=MY_SCHEMA_USER.BATCH_

我长时间使用自定义配置进行作业运行,但JobLauncherTestUtils似乎并不尊重这些配置属性。

  

我需要不同的表前缀,因为批处理数据库表由与连接的数据库用户不同的架构拥有。 (即MY_APP_USER尝试访问MY_SCHEMA_USER.BATCH_JOB_INSTANCE)。对表的非限定引用尝试(和失败)来解析针对MY_APP_USER而不是MY_SCHEMA_USER的批处理表。

我尝试创建JobRepositoryFactoryBean bean并使用@ConfigurationProperties("spring.batch")对其进行注释。然而 - 随着这一点无论如何 - 我不明白为什么我应该这样配置这些而不是属性。

如何使用JobLauncherTestUtils在junit测试中使用应用程序属性正确配置与Batch相关的bean?

1 个答案:

答案 0 :(得分:0)

固定

问题是因为我在BatchConfigurer类中创建了自己的MyBatchConfig bean。

  

BatchConfigurer使用Batch框架的每个组件(jobRepository,daos等)注册配置属性

这意味着未通过@Component带注释的DefaultBatchConfigurer类填充属性。至于为什么我决定将这段代码放在这里,即使我 - 作者 - 我也不确定。我想我不需要在最小的睡眠后编码。

感谢您放纵我的愚蠢!