使用Spock Mocks进行Grails 3.3集成测试

在Grails单元测试中,可以轻松使用Grails随附的Spock框架来模拟或存根协作者(例如服务)。

测试”一章对模拟协作者, doWithSpring / doWithConfig回调方法,在测试中模拟bean的FreshRuntime批注进行了一些解释,但是它们主要用于单元测试

在集成测试中模拟bean怎么样?

如果我们有控制器怎么办

class AnimalRegistrationController {
    AnimalRegistrationService animalRegistrationService

    def arrival(ArrivalCommand arrival) {

        animalRegistrationService
            .registerArrival(arrival)
            .map { ArrivalErrorMessage aem ->
                renderErrors(aem)
            }.orElse {
                render status: 200
            }
    }
}

哪个调用了服务,哪个调用了存储库–这可能会执行您不想在集成测试中发生的外部调用。

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集成测试,我把它调整到工作的Grails 3.3 -这是基于 Spring的引导,但并没有完全使用所有我们在香草 Spring应用程序中使用了Spring的注解。

因此,我们使用DetachedMockFactorysrc/test/groovy创建了一个专门用于测试的配置,例如

import spock.mock.DetachedMockFactory
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.context.annotation.Bean
...

@TestConfiguration
class TestRepositoryConfig {

    private DetachedMockFactory factory = new DetachedMockFactory()

    @Bean
    ArrivalRepository arrivalRepository() {
        factory.Mock(ArrivalRepository)
    }
}

2.整合测试

现在,通过使用@Autowired 按类型注入模拟的bean,可以在Grails 3集成测试中使用模拟的bean。 我们可以像往常一样创造期望。

@Integration
class ArrivalApiIntegrationSpec extends Specification {

    @Value('${local.server.port}')
    Integer serverPort

    @Autowired
    ArrivalRepository mockedArrivalRepository

    void "should create an arrival"() {

        given:
        1 * mockedArrivalRepository.registerArrival(_) >> {
            Optional.empty()
        }

        when:
        def response = new RestBuilder().post('http://localhost:{serverPort}/api/arrivals') {
            urlVariables([serverPort: serverPort])
            json {
                animalId = 1
                date = '2017-01-01'
            }
        } 

        then:
        response.status == 200
    }
}

3.依赖

为了使上述方法起作用,您实际上必须引入一个基本的spock-lang依赖关系。

将其添加到您的build.gradle

dependencies {
  ...
  testCompile 'org.spockframework:spock-core:1.1-groovy-2.4'
  testCompile 'org.spockframework:spock-spring:1.1-groovy-2.4'

八大兵 完成。

而已

现在,我们已经完全控制了模拟的bean,就像在进行单元测试一样。

翻译自: https://www.javacodegeeks.com/2017/07/grails-3-3-integration-testing-spock-mocks.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值