如何使用 Spock 使用 @Autowired 测试 class

How to test class with @Autowired using Spock

我在 src/groovy 中有一个 class 像这样

public class MyClass {

@AutoWired
SomeOtherClass someOtherClass

String test() {
    return someOtherClass.testMethod()
}
}

当我为此方法编写测试时出现错误:Cannot invoke method testMethod() on null object

这是我的测试:-

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

我做错了什么?有没有办法模拟 @Autowired class?

你需要嘲笑你的 someOtherClass。像这样

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

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

虽然之前的答案应该有效,但 spock 提供了更优雅的方式来根据需要注入 bean。您可以使用 doWithSpring 闭包来声明 bean,就像使用 resources.groovy.

的 grails 中提供的 spring dsl 支持一样
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"
}
}