我即将开始学习spock,我正在尝试一些基本的东西。 我想检查File的:exist()和getText()功能 所以我写了以下测试:
class MyTestSpec extends Specification {
def "test file"() {
given:
def mockFile = Mock(File,constructorArgs :["./doesNotExist.txt"])
mockFile.exists() >> true
mockFile.getText() >> "sampleText"
when:
def res = ""
if(mockFile.exists()) {
res = mockFile.getText()
}
then:
"sampleText" == res
1 * mockFile.exists()
1 * mockFile.getText()
}
}
此操作失败:
Too few invocations for:
1 * mockFile.getText() (0 invocations)
Unmatched invocations (ordered by similarity):
None
当我评论'验证'然后'然后'块,我得到:
java.lang.NullPointerException at java.io.FileInputStream。(FileInputStream.java:138)at groovy.util.CharsetToolkit。(CharsetToolkit.java:69)at MyTestSpec.Test现有资源(MyTestSpec.groovy:83)
所以我的问题是:我是如何组织我的测试的?为什么假设不应该调用getText?
我使用groovy 2.4和spock 1.0
答案 0 :(得分:3)
解决方案将是:
@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib:3.1')
@Grab('org.ow2.asm:asm-all:5.0.3')
import spock.lang.*
class MyTestSpec extends Specification {
def "test file"() {
given:
def mockFile = GroovyMock(File, constructorArgs :["./doesNotExist.txt"])
when:
def res = ""
if(mockFile.exists()) {
res = mockFile.getText()
}
then:
"sampleText" == res
1 * mockFile.exists() >> true
1 * mockFile.getText() >> "sampleText"
}
}
关于问题是创造一个模拟。由于groovy的动态性质,一些功能 - 例如File
类的getText()
方法在运行时添加。它需要以不同的方式构造模拟。看看spock mock implementation enum并提取:
专门针对Groovy调用者的实现。支持模拟动态方法,构造函数,静态方法以及特定类型的所有对象的“魔术”模拟。
第二个问题是定义模拟行为并验证交互。当你同时使用模拟和存根时,它必须在同一个交互中发生(这里,在then
块中),here是文档的相关部分。