Разрешить выражение Spring @Value в тестах JUnit
Здесь приведен фрагмент Spring bean:
@Component
public class Bean {
@Value("${bean.timeout:60}")
private Integer timeout;
// ...
}
Теперь я хочу протестировать этот bean с помощью теста JUnit. Поэтому я использую SpringJUnit4ClassRunner и аннотацию ContextConfiguration.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class BeanTest {
@Autowired
private Bean bean;
// tests ...
@Configuration
public static class SpringConfiguration {
@Bean
public Bean bean() {
return new Bean();
}
}
}
К сожалению SpringJUnit4ClassRunner не может разрешить выражение @Value
, даже если предоставляется значение по умолчанию (бросается NumberFormatException). Кажется, что бегун даже не способен анализировать выражение.
Что-то не хватает в моем тесте?
Ответы
Ответ 1
В тестовом классе @Configuration
отсутствует экземпляр PropertyPlaceholderConfigurer
, и поэтому Spring не знает, как разрешить эти выражения; добавьте bean следующим образом в класс SpringConfiguration
@org.springframework.context.annotation.Bean
public static PropertyPlaceholderConfigurer propertyPlaceholderConfigurer() {
PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
ppc.setIgnoreResourceNotFound(true);
return ppc;
}
и переместите его в отдельный класс и используйте
@ContextConfiguration(classes=SpringConfiguration.class)
чтобы быть более конкретным при выполнении теста.