Сценарий

Замените свойство @Value в @Configuration во время теста загрузки Spring…

К сожалению, эти тестовые значения не могут быть переопределены с помощью простого файла свойств, констант (String) или аналогичных, вместо этого я должен использовать некоторые настраиваемые записанные свойства, разрешающие класс Java (например, TargetProperties.getProperty("some.username")).

К сожалению, эти тестовые значения не могут быть переопределены с помощью простого файла свойств, констант (String) или аналогичных, вместо этого я должен использовать некоторые настраиваемые записанные свойства, разрешающие класс Java (например, PropertySource).…

Вопрос

У меня проблема в том, что когда я добавляю пользовательский @Value в @Configuration в своей тестовой конфигурации, уже слишком поздно, потому что этот {{X2}} будет добавлен после например {{X3}} был создан.…

Код

Класс производственной конфигурации

@Configuration
public class SomeConfiguration {

    @Value("${some.username}")
    private String someUsername;

    @Value("${some.password}")
    private String somePassword;

    @Bean
    public RestTemplate someRestTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        restTemplate.getInterceptors().add(
            new BasicAuthorizationInterceptor(someUsername, somePassword));

        return restTemplate;
    }

}

Класс конфигурации теста

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class SomeTest {

    @SpringBootConfiguration
    @Import({MySpringBootApp.class, SomeConfiguration.class})
    static class TestConfiguration {

        @Autowired
        private ConfigurableEnvironment configurableEnvironment;

        // This doesn't work:

        @Bean
        @Lazy(false)
        // I also tried a @PostConstruct method
        public TargetPropertiesPropertySource targetPropertiesPropertySource() {
            TargetPropertiesPropertySource customPropertySource =
                new TargetPropertiesPropertySource();
            configurableEnvironment.getPropertySources().addFirst(customPropertySource);
            return customPropertySource;
        }
    }
}
7
Markus Ratzer 8 Сен 2016 в 19:31

3 ответа

Лучший ответ

Вы можете использовать внедрение конструктора в производственных случаях, что позволяет настроить конфигурацию вручную:

@Configuration
public class SomeConfiguration {

    private final String someUsername;
    private final String somePassword;

    @Autowired
    public SomeConfiguration(@Value("${some.username}") String someUsername,
       @Value("${some.password}") String somePassword) {
       this.someUsername = someUsername;
       this.somePassword = somePassword;
    }
...
)
}

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class SomeTest {

    private SomeConfiguration config;

    @Before
    public init() {
      config = new SomeConfiguration("foo", "bar");
    }
}
4
Journeycorner 8 Сен 2016 в 16:41

Вы можете переопределить свойства непосредственно в аннотации @SpringBootTest, используя параметр properties:

@SpringBootTest(properties = {"some.username=user", "some.password=pwd"},
                webEnvironment = SpringBootTest.WebEnvironment.NONE)
13
alexbt 29 Май 2017 в 19:33

Вы можете использовать { {X0}}

@TestPropertySource(
    properties = {
        "some.username=validate",
        "some.password=false"
    }
)
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class ApplicationTest {
    //...
}
10
Henrik Aasted Sørensen 24 Авг 2017 в 14:30