Grails 如何使用Spock使用@Autowired测试类

Grails 如何使用Spock使用@Autowired测试类,grails,testing,spock,Grails,Testing,Spock,我在src/groovy中有这样一个类 public class MyClass { @AutoWired SomeOtherClass someOtherClass String test() { return someOtherClass.testMethod() } } def "test test"(){ setup: myClass.someOtherClass = Mock(SomeOtherClass) myClass.someOtherCla

我在
src/groovy
中有这样一个类

public class MyClass {

@AutoWired
SomeOtherClass someOtherClass

String test() {
    return someOtherClass.testMethod()
}
}
def "test test"(){
    setup:
    myClass.someOtherClass = Mock(SomeOtherClass)
    myClass.someOtherClass.testMethod() >> "somevalue"

    expect:
    myClass.test() == "somevalue"
}
当我为这个方法编写测试时,我得到一个错误:
无法调用null对象上的testMethod()

这是我的测试:-

def "test test" () {
    expect:
        myClass.test() == "somevalue"
}

我做错了什么?有没有办法模仿
@Autowired
类?

你需要模仿你的
其他类。像这样的

public class MyClass {

@AutoWired
SomeOtherClass someOtherClass

String test() {
    return someOtherClass.testMethod()
}
}
def "test test"(){
    setup:
    myClass.someOtherClass = Mock(SomeOtherClass)
    myClass.someOtherClass.testMethod() >> "somevalue"

    expect:
    myClass.test() == "somevalue"
}

虽然前面的答案应该是可行的,但斯波克提供了更优雅的方法,可以根据需要注入豆子。您可以使用doWithSpring闭包来声明bean,就像grails中使用
resources.groovy提供的SpringDSL支持一样

class MyClass extends Specification{
def setup(){

   static doWithSpring={
       someOtherClass(SomeOtherClass)
       //declare below if want to inject myClass somewhere else as a bean else not
       /*myClass(MyClass){bean->
          someOtherClass = someOtherClass
      }*/
   }
}

def "test test" () {
    expect:
        myClass.test() == "somevalue"
}
}

只有当这一行出现时,这才有效
myClass.someOtherClass.testMethod()>>“somevalue”
而不是这样做,我实际上希望从实际方法返回值,而不是模拟方法的值。那么这不是单元测试。您应该在自己的规范中测试
someOtherClass.testMethod()
SomeOtherClassSpec
。对其他类的调用应该被存根/模拟。您是否尝试过doWithSpring闭包?