Интеграционный тест со споком.Загрузить контекст перед первым тестом - PullRequest
0 голосов
/ 17 ноября 2018

Давайте рассмотрим очень простой пример, демонстрирующий мою точку зрения:

@SpringBootTest
class Tmp extends Specification{

    @Autowired
    private CarService carService;

    def "getCarById"(int id) {
        return carService != null ? carService.getById(id) : new Car();
    }

    def "validate number of doors"(Car car, int expectedNrOfDoors) {
        expect:
        car.getNrOfDoors() == expectedNrOfDoors

        where:
        car               || expectedNrOfDoors
        getCarById(1)     || 3
        getCarById(2)     || 3
        getCarById(3)     || 5
    }
}

Сначала будет вызван getCarById(_) метод. Затем будет создан контекст, а затем будет выполнен validate number of doors тест.

Можно ли создать контекст "в самом начале"? чтобы иметь к нему доступ (и к carService) в методе getCarById(_)?

1 Ответ

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

Проблема с вашим примером заключается в том, что вы пытаетесь получить доступ к экземпляру CarService из контекста в блоке where. Код из блока where используется для создания нескольких тестов на ранней стадии, достаточно близко к загрузке класса.

Я предлагаю заменить параметр Car только идентификатором автомобиля. Затем вы звоните getCarById в блоке given. В это время контекст будет загружен и carService доступен.

@SpringBootTest
class Tmp extends Specification {

    @Autowired
    private CarService carService

    def "validate number of doors"(int carId, int expectedNrOfDoors) {
        given:
        Car car = carService.getById(carId)

        expect:
        car.getNrOfDoors() == expectedNrOfDoors

        where:
        carId || expectedNrOfDoors
        1     || 3
        2     || 3
        3     || 5
    }
}
...