Надлежащее использование TestPropertyValues ​​в весенних загрузочных тестах - PullRequest
0 голосов
/ 16 февраля 2019

Я сталкивался с TestPropertyValues, что кратко упоминается в документации по Spring Boot здесь: https://github.com/spring-projects/spring-boot/blob/2.1.x/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc#testpropertyvalues

Здесь также упоминается в Руководстве по миграции: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide#environmenttestutils

Оба примерапокажите переменную environment для применения свойств, но другой документации, которую я мог бы найти, нет.

В моих тестах настройка свойства приходит слишком поздно, чтобы повлиять на внедрение свойства (через @Value) дляВесенняя фасольДругими словами, у меня есть конструктор, подобный следующему:

  public PhoneNumberAuthorizer(@Value("${KNOWN_PHONE_NUMBER}") String knownRawPhoneNumber) {
    this.knownRawPhoneNumber = knownRawPhoneNumber;
  }

Поскольку вышеупомянутый конструктор вызывается до того, как тестовый код сможет запустить, нет способа изменить свойство с помощью TestPropertyValues в тесте передон используется в конструкторе.

Насколько я понимаю, я могу использовать параметр properties для @SpringBootTest, который обновляет среду перед созданием bean-компонентов, так что же является подходящим использованием TestPropertyValues?

1 Ответ

0 голосов
/ 19 февраля 2019

TestPropertyValues на самом деле не предназначен для @SpringBootTest.Это гораздо полезнее, когда вы пишете тесты, которые вручную создают ApplicationContext.Если вы действительно хотите использовать его с @SpringBootTest, это можно сделать с помощью ApplicationContextInitializer.Примерно так:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(initializers = PropertyTest.MyPropertyInitializer.class)
public class PropertyTest {

    @Autowired
    private ApplicationContext context;

    @Test
    public void test() {
        assertThat(this.context.getEnvironment().getProperty("foo")).isEqualTo("bar");
    }

    static class MyPropertyInitializer
            implements ApplicationContextInitializer<ConfigurableApplicationContext> {

        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            TestPropertyValues.of("foo=bar").applyTo(applicationContext);
        }

    }

}

В собственном тесте Spring Boot совсем немного используется TestPropertyValues.Например, applyToSystemProperties очень полезен, когда вам нужно установить системные свойства, и вы не хотите, чтобы они случайно оставлялись после завершения теста (см. Пример EnvironmentEndpointTests ).Если вы будете искать в базе кода, вы найдете немало других примеров того, как она обычно используется.

...