Разрешить выражение Spring @Value в тестах JUnit

Вот фрагмент Spring bean:

@Component
public class Bean {

    @Value("${bean.timeout:60}")
    private Integer timeout;

    // ...
}

Теперь я хочу протестировать этот компонент с помощью теста 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). Кажется, что бегун даже не может разобрать выражение.

Чего-то не хватает в моем тесте?


person Bernhard    schedule 02.01.2014    source источник
comment
Это похоже на аналогичный поток: stackoverflow.com/ вопросы/17353327/   -  person Ernestas Kardzys    schedule 02.01.2014


Ответы (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)

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

person nobeh    schedule 02.01.2014
comment
Работает также без установки PropertyPlaceholderConfigurer для игнорирования ненайденного ресурса. - person Bernhard; 02.01.2014