如何在spock for Grails域模拟中避免空字段错误

如何在spock for Grails域模拟中避免空字段错误,grails,spock,Grails,Spock,在这个简单的域中使用Grails2.2.0 class Order { static mapping = {table "ticket_order"} String foo } 和相关的斯波克试验 @TestFor(Order) class OrderSpec extends Specification { def "sensible constraints for order class"() { setup: mockForConstraintsTes

在这个简单的域中使用Grails2.2.0

class Order {
    static mapping = {table "ticket_order"}

    String foo
}
和相关的斯波克试验

@TestFor(Order)
class OrderSpec extends Specification {
def "sensible constraints for order class"() {
    setup:
      mockForConstraintsTests(Order)

      when:
      def order = new Order(
        foo : foo
      )
      order.validate()

      then:
        !order.errors.hasFieldErrors("foo")

      where:
        foo = "bar"

}
}
我得到这个输出

grails> test-app unit: Order -echoOut
| Running 1 spock test... 1 of 1
--Output from sensible constraints for order class--
| Failure:  sensible constraints for order class(uk.co.seoss.presscm.OrderSpec)
|  Condition not satisfied:

!order.errors.hasFieldErrors("foo")
||     |      |
||     |      true
||     org.codehaus.groovy.grails.plugins.testing.GrailsMockErrors: 1 errors
||     Field error in object 'uk.co.seoss.presscm.Order' on field 'foo': rejected value [null];

有人能解释一下为什么我得到空值,我没有正确设置属性吗?我已经尝试了一些简单的公式,但毫无乐趣。它在标准单元测试中运行良好。

在我看来,它就像是您混合了数据驱动和基于交互的测试风格。 where块仅在数据驱动的上下文中提到,而when/then组合则在交互测试的上下文中提到


尝试将def foo=“bar”放在测试的顶部。

然后
可以用于任何测试(不仅仅是基于交互),并且它与
where
一起工作良好。您是否尝试过普通JUnit测试?我最好的猜测是这个问题与斯波克无关。