2017-02-10 100 views
-1

我有一個Java類MyClass的有重載方法的過程嘲笑一個重載的Java方法:如何使用斯波克

class MyClass { 
    private String process(String requestId, String request) { 
     // Initial processing, creates processObject from request 
     // then class actual processing: 
     String temp = process (processObject); 
     // do stuff I want to test, generate response 
     return response; 
    }; 
    private String process(ProcessClass processObject) { 
     String result; 
     // do actual processing of processObject 
     return result; 
    } 
} 

我想測試使用斯波克第一process()方法。我試圖用間諜模擬重載的進程(ProcessClass)。這裏的testProcess.groovy至今:

class TestProcessUsingString extends Specification { 
    given: 
     def testInput = "TestInput" 
     def myObject = Spy(MyClass) { 
     process(_ as ProcessClass) >> "My result string" 
     } 
    when: 
     def response = myObject.process("TestInput") 
     // Check response 

此方法不起作用嘲笑的方法處理(ProcessClass ...),因爲我本來期望。我諮詢了http://spockframework.org/spock/docs/1.0/interaction_based_testing.html,但我無法弄清楚。

我該如何嘲笑MyClass.process(ProcessClass),以便我可以從它返回一個假的答案並將其傳遞給其他進程函數?

+0

爲什麼不把你想測試的東西移動到可測試的方法? –

回答

0

Spock嘲笑,存根和間諜是基於Java或CGLIB動態代理。這些反過來又創建了運行時的子類,覆蓋了所有的方法,並將它們掛鉤,以提供模擬測試所需的特性。然而,你使用私有方法,這解釋了爲什麼這不起作用。此外,除非絕對必要,否則測試私人方法和使用間諜是不好的做法。是什麼使這裏需要間諜?