Пытаетесь загрузить различные свойства для тестирования интеграции огурца в Spring Boot App? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь использовать разные свойства с огурцом для запуска интеграционных тестов для моего приложения с весенней загрузкой.Я могу заставить его работать, если я использую свойства по умолчанию, загруженные в основной класс Application.Однако когда я указываю @TestPropertySource для этого другого расположения свойств конфигурации, он все равно использует контекст приложения основного класса приложения.Таким образом, контекст приложения при выполнении теста такой же, как и при работе приложения на сервере.Я не хочу это.

Это веб-приложение, связанное с работой, использующее Spring Boot 1.5.18, Cucumber 4.2.2.

Структура каталогов: src / main / java для всех моих классов и пакетов java, src/ main / resources с application.properties и некоторыми другими, папка корневого уровня со свойствами ведения журнала среды и безопасности.Затем у меня есть src / test / java с моим кодом огурца и src / test / resources с моим измененным файлом application.properties, который я хотел бы использовать при выполнении теста.Я также хотел бы указать другую среду, безопасность, протоколирование файлов свойств конфигурации для тестирования.

Это мой класс ApplicationTest.Java, где я пытаюсь использовать разные источники свойств.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = 
SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource( value = 
{"file:${env.dir}/deploy/acceptance/config/env.properties",
    "file:${env.dir}/deploy/acceptance/config/AppConfig.properties",
    "file:${env.dir}/deploy/acceptance/security/auth.properties", 
"classpath:application-test.properties"})
public abstract class ApplicationTest {
    public ApplicationTest() {
}

Это мой класс Cucumber4Test.Java

@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources", 
    plugin = {"pretty", "html:target/cucumber", 
"junit:target/reports/cucumber.json"}, glue = { "com.test.packages.cucumber" 
}, monochrome = true)

public class CucumberTest {

}

Я не уверен, что мне что-то не хватает в этих классах, поскольку я следовал руководству.Но, как я уже сказал, если я не установлю какие-либо источники свойств в своем классе ApplicationTest и запусту CucumberTest.java как junit в eclipse, или запусту mvn clean install, mvn test и т. Д., Тесты cucumber будут выполняться, как ожидается.

Я изучил вопросы здесь, пытаясь сделать кучу вещей, и мне кажется, что ничего не работает. Переопределить @PropertySource с помощью @TestPropertySource в Spring Boot

Загрузить другой application.yml в тесте SpringBoot

РЕДАКТИРОВАТЬ: причина, по которой я считаю, @TestPropertySource isnне работает из-за следующего: приоритет источника свойства в Spring.Когда я загружаю огурец в src / test / java, он загружает те свойства, которые я указал, но затем запускает приложение в папке src / main / java.Здесь его загрузка свойств по умолчанию в Application.java.В документации Spring указано, какие свойства загружаются в последнюю очередь, имеют приоритет, поэтому мой TestPropertySource перезаписывается при запуске приложения.

Мое рабочее решение: я хотел, чтобы огурец работал в Jenkins отдельно от нашего конвейера сборки и развертывания.Но не смог найти способ обойти стандарт моей работы для пути и структуры каталогов для конфигов и свойств.Итак, что я сделал:

1) Добавьте нужные мне свойства в classpath в src / test / resources.

2) Теперь это немного странно, но второй Application.java в src / test / java с @Propertysources отражает свойства, которые я хотел использовать.

3) В jenkins перед выполнением теста mvn я выполняю шаг перед сборкой.Эта оболочка просто перемещает src / test / java / package / with / Application.java в src / main / java / package / with / Application.java.Это переписывает обычный класс Application.java с другими свойствами.

4) запустить mvn test

5) прибыль

1 Ответ

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

Это работает.

Используя приложение по умолчанию.

package cucumber.examples.spring.txn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@SpringBootApplication
@EnableWebMvc
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

И некоторые application.properties

key=App

Затем запустите:

package cucumber.examples.spring.txn;

import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
public class RunCukesTest {
}

и используйте этотестовая конфигурация контекста

package cucumber.examples.spring.txn;

import cucumber.api.java.Before;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;

@SpringBootTest
@AutoConfigureMockMvc
public class CucumberContextConfiguration  {

    @Value("${key}")
    private String value;

    @Before
    public void setup_cucumber_spring_context(){
        // Dummy method so cucumber will recognize this class as glue
        // and use its context configuration.

        System.out.println("Property was " + value);
    }
}

Напечатает Property was App.

Добавление @TestPropertySource("classpath:test.properties") к CucumberContextConfiguration и создание файла test.properties, содержащего

key=Test

Напечатает Property was Test.

...