Spring Boot: как переопределить свойства по умолчанию в модульных тестах - PullRequest
0 голосов
/ 21 ноября 2018

Я попытался загрузить второй файл свойств для своих модульных тестов, который переписал бы некоторые свойства.

Загрузка с помощью @PropertySource на @Configuration не работала, загрузка с помощью @TestPropertySource didnтоже не работает.Работает только установка properties непосредственно на @TesPropertySource, но она НЕ работает, когда я пытаюсь превратить ее в метааннотацию.

Вот пример проекта: https://github.com/cptwunderlich/SpringTestProperties

Я бы предпочел загрузить один файл, чтобы повлиять на все тесты (например, с помощью @PropertySource), но если это не сработает, по крайней мере, было бы неплохо иметь собственную метааннотацию, поэтому мне не нужно помещать это на каждый тест.В основном я хочу , а не импортировать некоторые данные в БД для тестов (spring.datasource.data), а затем также изменить используемую базу данных - без копирования всей конфигурации и необходимости каждый раз менять ее в двух местах..

Важные биты:

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
public class TestconfigApplicationTests {

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

    @Test
    public void assertValue() {
        Assert.assertEquals("foobar", testproperty);
    }

}

В качестве альтернативы класс конфигурации в пакете тестов :

@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
@PropertySource("classpath:application-test.properties")
public class GlobalTestConfig {
}

Обновление:

Основное предложение в ответах - использовать @ActiveProfile для активации «тестового» профиля, что приведет к загрузке «application-test.yaml».Это лучше, чем @TestPropertySource, но мне все еще нужно поместить аннотацию на каждый тестовый класс.Я попытался создать метааннотацию - которая должна работать - поэтому, по крайней мере, у меня есть только одна пользовательская аннотация, где я могу связать другие настройки.Но это не сработает.

Идеальное решение - установить эти параметры глобально с помощью одного класса конфигурации, вместо того, чтобы помещать аннотацию в каждый тест.Я все еще ищу это решение или, по крайней мере, отлаживаю метааннотацию перед закрытием этого вопроса. Редактировать: Я создал проблему Jira: SPR-17531

Редактировать

ОК, я немного запутался, поэтому я перепробовал все различные комбинации:

  • @TestPropertySource(locations = "classpath:application-test.properties") на тесте, на самом деле работает сейчас.хах.
  • @ActiveProfiles("test") на Тестовые работы.
  • Мета-аннотация с @ActiveProfiles не работает не работает.РЕДАКТИРОВАТЬ: он делает ...
  • Глобальная конфигурация любого вида (TestPropertySource, ActiveProfiles, Propertysource) делает не работа
  • (Наличие application.properties в test / resourcesтакже не работает, потому что он не перезаписывает отдельные свойства, но полный файл, т. е. мне нужно все переопределить и дублировать.)

РЕДАКТИРОВАТЬ:

ОК, моя ошибка.Мета-аннотация работает - я забыл установить политику хранения, и по умолчанию это CLASS.Добавление @Retention(RUNTIME) исправляет это.

Не похоже, что есть способ глобально установить это в коде (т. Е. Без настройки в моей IDE того, как выполняются тесты), поэтому мне придется идтис профилем на данный момент.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вы можете добавить application.properties к

src/test/resources

Тогда все свойства, находящиеся в этом файле, переопределяют их из src / main / resources / application.properties.

Так что вы нене нужны профили и любые дополнительные аннотации, такие как @ TestPropertySource

0 голосов
/ 21 ноября 2018

Вы можете использовать @ActiveProfiles("test").Это установит свойства application-test.yml в тестовую среду.

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class TestconfigApplicationTests {
    ...
}

Если нам нужно настроить таргетинг на разные среды, для этого в Boot предусмотрен встроенный механизм, поэтому нет необходимости в дополнительных библиотеках или рефакторингах.

Мы можем просто определить файл application-environment.properties в каталоге src/main/resources - и затем установить профиль Spring с тем же именем среды.

Например, если мы определим stagingили test, это означает, что нам нужно будет определить промежуточный или тестовый профиль, а затем application-staging.properties или application-test.properties.

Этот файл env будет загружен и будет иметь приоритет над заданным по умолчанию.файл свойств, который application.properties.Обратите внимание, что файл по умолчанию все еще будет загружен, просто при столкновении свойств файл свойств среды имеет приоритет, то есть свойства, указанные в application-staging.properties или application-test.properties, будут переопределять свойства в application.properties.

Каждый тестовый класс использует свой собственный профиль, поэтому вам нужно указать активный профиль для каждого класса.

Еще одна вещь, которая может вас заинтересовать, - это то, что вы можете макетировать сервисы через configurationклассы

@Configuration
@Profile("mockEntityService")
public class EntityServiceMockProvider {

    @Bean
    @Primary
    public EntityService entityService() {
        EntityService mockedEntityService = Mockito.mock(EntityService.class);

        Entity entity= Mockito.mock(Entity.class);
        when(mockedEntityService.save(any(Entity.class)))
                .thenReturn(entity);

        return mockedEntityService ;
    }
}

В тестовых классах вы можете использовать несколько активных профилей: например, @ActiveProfiles({"test", "mockEntityService"})

, поэтому вместо реальной реализации EntityService вы будете использовать фиктивную реализацию.

...