Groovy Spock文件测试

时间:2015-10-25 09:01:51

标签: unit-testing groovy spock

我即将开始学习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

1 个答案:

答案 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是文档的相关部分。