当我在Spring中运行SpringJUnit4ClassRunner Test时,我从@Bean @Autowired值。
但是问题是我们正在使用多个Configures来设置@Bean,如下所示
@Configuration
public class ParentConfig {
@Bean
public Optional<Integer> sampleOptionalInteger(@Value("${sample.int:}") final Integer sample) {
return Optional.of(sample);
}
}
使用parentConfig的子配置为
@Profile("sample")
@Import({
ParentConfig.class,
})
@Configuration
public class ChildConfig {
@Bean
public Integer sampleInt(final Optional<Integer> sampleOptionalInteger) {
return sampleOptionalInteger.map(s -> s).orElseThrow(() -> new IllegalArgumentException("You need to specify sample int"));
}
}
测试代码为
@ActiveProfiles("sample")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
ChildConfig.class,
})
@TestPropertySource(locations = {
"sample.properties"
})
public class SampleConfigTest {
@Autowired
private Integer sampleInt;
}
当我调试执行测试代码时,在ParentConfig
的参数sampleOptionalInteger
中,我们可以从属性中获取整数(可以通过在断点处暂停来确认)。
但是我们无法在ChildConfig
的参数sampleInt
中获得该值,结果就是Optional.empty
。
我不知道为什么会这样。有人可以解释这里发生了什么吗?