Интеграционное тестирование без контекста Spring - PullRequest
0 голосов
/ 21 мая 2019

Должен ли я всегда запускать контекст Spring во время интеграционных тестов?(Я имею в виду использование @SpringBootTest аннотации)

В настоящее время я пишу интеграционный тест, включающий несколько классов, и для того, чтобы сделать его быстрее, я создаю граф объектов вручную (т.е.Начать Spring IoC контейнер).Поэтому в настоящее время мой интеграционный тест (написанный на Spock) выглядит следующим образом:

class UserConverterIT extends Specification {

    UserConverter converter = new UserConverter(new UserDtoFactory(new UserGroupPolicy()))

    def 'should ...'() {
        when:
        converter.convert(...)

        then:
        ...
    }
}

В качестве альтернативы я мог бы добавить @SpringBootTest аннотацию, поставить @Autowire над полем UserConverter, и все зависимости будут введены автоматически.Однако первый подход намного быстрее.Что-то не так в этом подходе?

1 Ответ

0 голосов
/ 21 мая 2019

Как вы сказали, аннотация @Autowired внедрит все зависимости и автоматически загрузит весь контекст.Ваш подход тоже работает, но он действительно хрупок!Как вы можете гарантировать, что в ваших тестах вам никогда не понадобятся бобы, которые вы не добавили вручную?

Также есть еще одна важная вещь.Когда вы позволяете пружине вводить зависимости, если есть проблема с объявлением bean-компонентов, проблема будет проявляться на этапе тестирования, но при вашем подходе они не будут идентифицироваться.

Также иногда вы можете @Autowired интерфейс, который сообщает Spring, чтобы получить реализацию во время выполнения.Например, у вас есть родительский модуль, который имеет интерфейс, который реализуется в дочернем модуле.Если вы хотите написать тестовый пример в parent, у вас нет доступа к дочерней реализации, чтобы создать новое из этого.

...