Spock Framework, поставляемый с Grails, легко использовать для насмешки или оцепления соавтора (например, службы) в наших модульных тестах Grails.
В главе « Тестирование» объясняется немного о том, как насмехаться над соавторами, doWithSpring doWithConfig обратного вызова doWithSpring / doWithConfig , аннотации FreshRuntime для FreshRuntime в тестах, но в основном они предназначены для модульного тестирования .
Как насчет насмешивания бобов в интеграционном тесте?
пример
Что делать, если у нас есть контроллер
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
class AnimalRegistrationController { AnimalRegistrationService animalRegistrationService def arrival(ArrivalCommand arrival) { animalRegistrationService .registerArrival(arrival) .map { ArrivalErrorMessage aem -> renderErrors(aem) }.orElse { render status: 200 } }} |
который вызывает сервис, который вызывает репозиторий — который может делать внешние вызовы, которые вы не хотите делать в интеграционном тесте.
|
1
2
3
4
5
6
7
8
|
class AnimalRegistrationService { ArrivalRepository arrivalRepository Optional registerArrival(Arrival arrival) { arrivalRepository.registerArrival(arrival) }} |
Ранее я писал, что в Grails 3.3 есть Spock 1.1, который дал нам несколько новых возможностей, таких как ответ по умолчанию для java.util.Optional … но он дал нам больше !
1. DetachedMockFactory и TestConfiguration
Теперь у нас также есть DetachedMockFactory, который мы можем использовать для объявления имитаций вне иерархии вне Specification , например, в конфигурации Spring.
Я был вызван этой статьей о тестировании Spring Integration и настроил его для работы с Grails 3.3 — который основан на Spring Boot, но не совсем использует все аннотации Spring, которые мы использовали в ванильном приложении Spring.
Поэтому мы создаем конфигурацию, специально для тестирования, в src/test/groovy используя DetachedMockFactory например
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
import spock.mock.DetachedMockFactoryimport org.springframework.boot.test.context.TestConfigurationimport org.springframework.context.annotation.Bean...@TestConfigurationclass TestRepositoryConfig { private DetachedMockFactory factory = new DetachedMockFactory() @Bean ArrivalRepository arrivalRepository() { factory.Mock(ArrivalRepository) }} |
2. Интеграционный тест
Теперь мы можем использовать фиктивный бин в нашем интеграционном тесте Grails 3, вводя его по типу с помощью @Autowired . Мы можем создать ожидания как обычно.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
@Integrationclass ArrivalApiIntegrationSpec extends Specification { @Value('${local.server.port}') Integer serverPort @Autowired ArrivalRepository mockedArrivalRepository void "should create an arrival"() { given: 1 * mockedArrivalRepository.registerArrival(_) >> { Optional.empty() } when: urlVariables([serverPort: serverPort]) json { animalId = 1 date = '2017-01-01' } } then: response.status == 200 }} |
3. Зависимость
Для того чтобы вышесказанное сработало, вам действительно необходимо включить одну существенную зависимость от спока-языка .
Добавьте его в свой build.gradle
|
1
2
3
4
|
dependencies { ... testCompile 'org.spockframework:spock-core:1.1-groovy-2.4' testCompile 'org.spockframework:spock-spring:1.1-groovy-2.4' |
Бада-Бинг. Готово.
это оно
Теперь у нас есть полный контроль над нашими поддельными компонентами, как если бы мы были в модульном тесте.
| Ссылка: | Интеграционное тестирование Grails 3.3 с помощью Спока Мокса от нашего партнера по JCG Теда Винке в блоге Теда Винке в блоге. |