Определить значения свойств Spring в Java

У меня есть несколько пружинных компонентов, которые связывают значения свойств с помощью аннотации @Value.

e.g.

@Value("${my.property}")
private String myField;

Обычно значения берутся из файлов свойств.

Тест, который я сейчас пишу, использует конфигурацию, полностью основанную на аннотациях.

e.g.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class)
public class AcceptanceTest implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Configuration
    @ComponentScan(basePackages = {
        "my.package.one",
        "my.package.two"
    })
    static class ContextConfiguration {
        @Bean
        public MyBean getMyBean(){
            return new MyBean();
        }
    }

    @Autowired
    private AnotherBean anotherBean;

    @Test
    public void testTest(){
        assertNotNull(anotherBean);
        . . .
    }   
    . . .

Я не хочу ссылаться на внешний файл свойств, так как хочу, чтобы все было локально для теста.

В любом случае, я могу указать в java значения для таких свойств, чтобы они автоматически подключались к любым компонентам, которые в них нуждаются.

Любая помощь будет оценена по достоинству.


person Ben    schedule 23.05.2014    source источник


Ответы (3)


Начиная с Spring Framework 4.1, вы можете использовать аннотацию @TestPropertySource для объявления свойств inlined для ApplicationContext, загружаемых для ваших тестов, следующим образом:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TestPropertySource(properties = { "foo = bar", "magicNumber: 42" })
public class ExampleTests { /* ... */ }

Обратитесь к Конфигурация контекста с источниками тестовых свойств справочного руководства.


До Spring Framework 4.1 самым простым способом было настроить пользовательский PropertySource и зарегистрировать его в Spring TestContext Framework (до загрузки ApplicationContext для вашего теста).

Вы можете добиться этого, реализовав пользовательский ApplicationContextInitializer и используя org.springframework.mock.env.MockPropertySource следующим образом:

public class PropertySourceInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    public void initialize(ConfigurableApplicationContext applicationContext) {
         applicationContext.getEnvironment().getPropertySources().addFirst(
           new MockPropertySource().withProperty("foo", "bar"));
    }
}

Затем вы можете зарегистрировать свой инициализатор для своего теста следующим образом:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = PropertySourceInitializer.class)
public class ExampleTests { /* ... */ }

С уважением,

Сэм (автор Spring TestContext Framework)

person Sam Brannen    schedule 23.05.2014
comment
Требуется ли для этого SpringJUnit4ClassRunner? Мои тесты в Groovy (используя Spock с SpringApplicationContextLoader) и ссылаются на класс конфигурации, который находится в Java. Компоненты, представленные в моем классе конфигурации, внедряются, но переопределенный метод initialize не вызывается. - person Paul; 17.12.2014
comment
Пол, Spring Boot SpringApplicationContextLoader поддерживает конфигурацию ApplicationContextInitializer через @ContextConfiguration(initializers=...) (или, насколько мне известно, через @SpringApplicationConfiguration(initializers=...) в более поздних версиях Spock). В общем, это должно работать. Попробуйте последнюю версию, и если это не сработает, рассмотрите возможность создания отчета об ошибке для Спока. - person Sam Brannen; 18.12.2014

Вот один простой подход:

@Configuration
public class PropertiesConfig {

    @Bean
    public PropertyPlaceholderConfigurer myConfigurer() {
        PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
        Properties props = new Properties();
        Map myMap = new HashMap<String, String>();

        myMap.put("my.property", "my value");
        myMap.put("second.my.property", "another value");
        props.putAll(myMap);

        configurer.setProperties(props);
        return configurer;
    }
}
person Andrei Stefan    schedule 23.05.2014

Если вы используете Spock, вы также можете использовать @TestPropertySource:

@SpringBootTest
@TestPropertySource(properties = [ "my.test.property = bar", "..." ])

Это требует, чтобы массив String был в синтаксисе Groovy, конечно, поймал меня. Я использую Спока 1.1

person chrismacp    schedule 05.07.2017