【问题标题】:Spock datatable just accepting integers in Speck inputsSpock 数据表只接受 Speck 输入中的整数
【发布时间】:2019-10-04 10:07:55
【问题描述】:

我正在将一个大型应用程序从 Grails 3.3 迁移到 Grails 4。

在我们遇到的与 Spock 相关的问题中,我们在 Grails 3.39 中使用的功能似乎缺失:当使用数据表表示规范时,输入列似乎接受了整数价值观

在下面的代码中,只有第一行斑点正在传递文本。没有接下​​来的两个,因为 spock 在将其传递给 Math.round(value)

之前正在转换为整数
import spock.lang.*

@Unroll
 void 'test to demostrate Spock is just accepting integer in datatable column value'() {
   expect:
       Math.round(value) == result   
   where:
   value     | result
   1234      | 1234
   4321.56d  | 4322d
   1111.56f  | 1112d
 }

我在 Grails 3.3 版中没有发现这个问题。

提前感谢您参加本期

胡安

更新:

更新:

所描述的行为变化实际上发生在基于数据表的测试之前是一个包含抛出异常的测试

解决方法:

将包含异常抛出的测试移至最后一个测试。

【问题讨论】:

  • 你指的是哪个版本的 spock?
  • 我将您的代码直接复制并粘贴到 github.com/jeffbrown/juansalvadorspock/blob/… 中,该测试似乎运行良好。
  • 你使用的是哪个 JDK?
  • “当使用数据表来表示规格时,输入列似乎接受了整数值” - 很难说你的项目出了什么问题,但绝对不是仅支持整数值的情况。可以使用任意对象或原语。
  • 嗨,杰夫,我已经更新了日志,问题是基于数据表的测试之前有一个包含抛出异常的测试

标签: grails datatable spock


【解决方案1】:

Grails 4 使用 org.spockframework:spock-core:1.2-groovy-2.5 并且在这个版本中它可以正常工作(就像在其他版本的 Spock 中一样)。

以这种方式更新您的规范:

import spock.lang.Specification
import spock.lang.Unroll

class RoundSpec extends Specification {
    @Unroll
    void 'Math.round(#value) == #result'() {
        setup:
        println "$value as ${value.class}"

        expect:
        Math.round(value) == result

        where:
        value    || result
        1234     || 1234
        4321.56d || 4322
        1111.56f || 1112
    }
}

然后你可以看到所有的测试用例都通过了测试,你也可以在输出中看到哪个类的哪些数据传入了测试:

所以 IntegerDoubleFloat 在您编写的所有情况下都通过而不是 Integer

我在您的测试中看到的是,您将 result 值作为 Double 两次,但 Math.round() 每次都返回 long。

【讨论】:

  • 嗨@cgrim,感谢您的回复。我使用的jar文件是spock-core-1.2-groovy-sources.jar
  • 您是否尝试过您的 Spock 实例中答案中的代码?输出一样吗?
  • 不,您不使用spock-core-1.2-groovy-sources.jar,因为顾名思义,它只包含源代码,没有二进制文件(类文件)。您必须使用另一个 JAR,其名称中同时指定了 Spock 版本 + Groovy 版本。
猜你喜欢
  • 2019-07-24
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
相关资源
最近更新 更多