YAML を読む処理を JUnit テストする時、( Spring Batch での話 )
@ContextConfiguration で、イニシャライザ指定
initializers = ConfigFileApplicationContextInitializer.class
を付けるだけでなく、
@EnableAutoConfiguration が必要
例)
application.yml に書いた、設定
address: group: info1: A info2: 120 aaa: bbb: ABC
読みだすクラス Setting
import java.util.Map; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @ConfigurationProperties(prefix="address") @Component public class Setting{ public Map<String, Object> group; @Value("${aaa.bbb}") public String name; public void setGroup(Map<String, Object> m) { group = m; } public Map<String, Object> getGroup(){ return group; } }
↑ を使用する Tasklet
@Component public class SampleTasklet implements Tasklet { @Autowired private Setting setting; @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { // TODO return RepeatStatus.FINISHED; } public Setting getSetting() { return setting; } }
この Tasklet をテストする時に、YAML を読んできてる Setting が
想定どおり読み込ませるかテストする JUnitソース
import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.ConfigFileApplicationContextInitializer; import org.springframework.context.ApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import org.springframework.test.context.junit4.SpringRunner; import org.sample.Setting; /** * SampleTaskletTest */ @RunWith(SpringRunner.class) @ContextConfiguration(classes = {Setting.class}, initializers = ConfigFileApplicationContextInitializer.class) @SpringJUnitConfig @EnableAutoConfiguration class SampleTaskletTest{ @Autowired public ApplicationContext ctx; private SampleTasklet tasklet; @BeforeEach void setUp() throws Exception{ tasklet = ctx.getAutowireCapableBeanFactory().createBean(SampleTasklet.class); } @Test void testExecute(){ assertTrue(true); Setting setting = tasklet1.getSetting(); assertEquals("ABC", setting.name); Map<String, Object> map = setting.group; assertEquals("A", map.get("info1")); assertEquals(120, map.get("info2")); // TODO } }
この @EnableAutoConfiguration を付け忘れると、1階層 Nest のYAML書式が読めても、
@ConfigurationProperties(prefix="xxxxx") で指定するMap が読まれなかったりする。
@EnableAutoConfiguration