2016-11-04 64 views
1

與@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關閉? –

回答

1

您需要模擬您的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。 –

1

儘管以前的答案應該可以工作,但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" 
} 
}