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闭包?