spock 集成测试
在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的注解。
因此,我们使用DetachedMockFactory
在src/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'
八大兵 完成。
而已
现在,我们已经完全控制了模拟豆,就好像我们在进行单元测试一样。
翻译自: https://www.javacodegeeks.com/2017/07/grails-3-3-integration-testing-spock-mocks.html
spock 集成测试