如何使用斯波克

如何使用斯波克

问题描述:

与@Autowired测试类我有src/groovy一类这样的如何使用斯波克

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课程?

+0

你有没有尝试做Spring关闭? –

您需要模拟您的someOtherClass。像这样的东西

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

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

这只适用于该行存在的情况'myClass.someOtherClass.testMethod()>>“somevalue”'而不是这样做,我实际上需要实际方法的返回值而不是模拟方法的值。 – Anthony

+0

然后它不是一个单元测试。你应该在自己的Spec,SomeOtherClassSpec中测试'someOtherClass.testMethod()'。调用其他类应调用Stubbed/Mocked。 –

尽管以前的答案应该可以工作,但spock根据需要提供了更加优雅的注入方式。你可以使用doWithSpring closure来声明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" 
} 
}