Разрешить выражение 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)

чтобы быть более конкретным при выполнении теста.