Spock为expect:和where:块中的Gradle任务方法提供临时文件

Spock为expect:和where:块中的Gradle任务方法提供临时文件,gradle,spock,Gradle,Spock,我想使用斯波克的数据驱动测试 我的任务有一个带有文件参数的方法要处理。结果是一个带有已处理行的数组。若并没有有效的处理方法,那个么数组的大小将为0。我使用JUnit规则创建临时文件夹,我怀疑这就是问题所在 我怎样才能解决这个问题 class H2JSpec extends Specification { @Rule TemporaryFolder temporaryFolder @Shared private ArrayList<File> tempFile

我想使用斯波克的数据驱动测试

我的任务有一个带有
文件
参数的方法要处理。结果是一个带有已处理行的
数组
。若并没有有效的处理方法,那个么数组的大小将为0。我使用JUnit规则创建临时文件夹,我怀疑这就是问题所在

我怎样才能解决这个问题

class H2JSpec extends Specification {

   @Rule
   TemporaryFolder temporaryFolder
   @Shared
   private ArrayList<File> tempFiles = []

   def "let's build the mappings for template"() {
      setup:
      Project project = ProjectBuilder.builder().build()
      H2JTask task = project.task('h2j', type: H2JTask)

      def inputs = ["""#dsfs

""",
    """#this file defines the mapping of h files declarations into java errorcodes: autoenum=off prefix=ec_ class=test.framework.base.MsgErrorCodes
"""]

      tempFiles.add(temporaryFolder.newFile('1.txt'))
      tempFiles.add(temporaryFolder.newFile('2.txt'))

      tempFiles[0].withWriter { it << inputs[0] }
      tempFiles[1].withWriter { it << inputs[1] }

      expect:
      task.prepareCommandList(a).size() == b

      where:
      a || b
      tempFiles[0] || 0
      tempFiles[1] || 1

   }
}
H2JSpec类扩展了规范{
@统治
临时文件夹临时文件夹
@共享
私有ArrayList临时文件=[]
def“让我们为模板构建映射”(){
设置:
Project=ProjectBuilder.builder().build()
H2JTask任务=项目任务('h2j',类型:H2JTask)
def输入=[“”“#DSF
""",
“”“#此文件定义了h文件声明到java错误代码的映射:autoenum=off prefix=ec_u类=test.framework.base.MsgErrorCodes
"""]
添加(临时文件夹.newFile('1.txt'))
添加(临时文件夹.newFile('2.txt'))

tempFiles[0]。使用writer{it老实说,我将完全取消使用
规则
,并以以下方式重写测试:

@Grab(group='org.spockframework', module='spock-core', version='1.0-groovy-2.4')

import spock.lang.*

class H2JSpec extends Specification {

  def "let's build the mappings for template"() {
    setup:
      def task = new A()

    when:
      def f = File.createTempFile('aaa', 'bbb')
      f.write(a)

    then:
      task.prepareCommandList(f).size() == b

    where:

      a          || b
      """#dsfs

    """          || 3
      """#this file defines the mapping of h files declarations into java errorcodes: autoenum=off prefix=ec_ class=test.framework.base.MsgErrorCodes
    """          || 2

  }
}

class A {
   List<String> prepareCommandList(File f) {
    f.readLines()
  }
}
@Grab(group='org.spockframework',module='spock-core',version='1.0-groovy-2.4')
导入spock.lang*
类H2JSpec扩展了规范{
def“让我们为模板构建映射”(){
设置:
def task=newa()
什么时候:
def=File.createTempFile('aaa','bbb')
f、 写(a)
然后:
task.prepareCommandList(f).size()==b
哪里:
a | | b
“”“#dsfs
"""          || 3
“”“#此文件定义了h文件声明到java错误代码的映射:autoenum=off prefix=ec_u类=test.framework.base.MsgErrorCodes
"""          || 2
}
}
甲级{
列表准备命令列表(文件f){
f、 readLines()
}
}

这非常顺利,事实上,当涉及到测试数据的处理集时,我们只需要一个文件即可处理。您如何处理多行字符串中的输入数据?我已经将它们隐藏在额外变量后面。我们是否可以更具体地将它们作为测试的资源?其中:a@Piotr,可能我会将多行字符串放在保存在
src/test/resources
下的文件中。这样,您就已经有了一个文件-只需要加载它。此外,测试变得更加清晰,因为您不需要所有这些临时文件夹、文件,无论什么都只会模糊测试。如果移动使用文件,您都可以使用spock数据表或列表-如注释中所示。两者都很好。很好的解决方案。我建议您在将
f
分配给临时文件后执行
f.deleteOnExit()
,以确保在测试终止时删除临时文件。