2015-06-16 34 views
2

我在Spock中使用Spy時遇到問題,它要麼不能正常工作,要麼我的理解錯誤,所以我試圖澄清這一點。 考慮這個代碼(JAVA):Spock Framework:間諜問題

public class CallingClass { 

    public String functionOne() { 
     //does stuff 
     return "one"; 
    } 

    public String functionTwo() { 
     String one = functionOne(); 
     return "some string " + one; 
    } 
} 

現在我想測試functionTwo調用functionOne的事實,以及從functionOne定義返回值(想象例​​如,如果functionOne真是複雜,我不想在我的測試中執行它只是想存根,並將其設置爲返回一定的值)。爲此,我寫在Groovy下面的測試(使用斯波克):

class CallingClassTest extends Specification { 

    def "check that functionTwo calls functionOne"() { 
     def c = Spy(CallingClass) 
     c.functionOne() >> "mocked function return" 

     when: 
     def s = c.functionTwo() 

     then: 
     1 * c.functionOne() 
     s == "some string mocked function return" 
    } 
} 

爲了做這樣的事情,斯波克是問我有cglib庫,所以我生成文件(在搖籃)看起來像這樣的:

apply plugin: 'groovy' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'org.codehaus.groovy:groovy:latest.release' 

    testCompile 'org.spockframework:spock-core:latest.release' 
    testCompile 'junit:junit:latest.release' 
    testCompile 'cglib:cglib-nodep:latest.release' 

} 

現在,當我運行測試,我預計functionOne沒有在所有被調用,而是要使用我的存根版本。相反,我得到這樣的:?

Condition not satisfied: 

s == "some string mocked function return" 
| | 
| false 
| 19 differences (44% similarity) 
| some string (-)o(-------)n(-------)e(----) 
| some string (m)o(cked fu)n(ction r)e(turn) 
some string one 

Condition not satisfied: 

s == "some string mocked function return" 
| | 
| false 
| 19 differences (44% similarity) 
| some string (-)o(-------)n(-------)e(----) 
| some string (m)o(cked fu)n(ction r)e(turn) 
some string one 

    at CallingClassTest.check that functionTwo calls functionOne(CallingClassTest.groovy:17) 

更是這樣,如果我這調試和設置斷點functionOne它被稱爲:(

缺少什麼我不應該在我的測試使用存根functionOne ?提供,只是返回字符串"mocked function return"

+0

只是爲了防止任何人像我一樣無知:在Spock中,你不能嘲笑私有方法(當然這裏的OP可能知道這一點!):他們會像間諜一樣正常運行。我發現Spock的這個「限制」(實際上是因爲它沒有使測試意義)令人驚訝,因爲你可以從你的Spy中調用這些方法(並且似乎嘲笑它們)在你的測試代碼中。可能會很好,如果Spock可以不允許這個或將其標記爲錯誤... –

回答

5

它應該是:

@Grab('org.spockframework:spock-core:0.7-groovy-2.0') 
@Grab('cglib:cglib-nodep:3.1') 

import spock.lang.* 

class CallingClassTest extends Specification { 

    def "check that functionTwo calls functionOne"() { 
     def c = Spy(CallingClass) 

     when: 
     def s = c.functionTwo() 

     then: 
     1 * c.functionOne() >> "mocked function return" 
     s == "some string mocked function return" 
    } 
} 

public class CallingClass { 

    public String functionOne() { 
     "one" 
    } 

    public String functionTwo() { 
     String one = functionOne()   
     "some string $one" 
    } 
} 

當你倆間諜/模擬和驗證這一點是如何指定返回值的。

+0

這實際上是有效的,它不需要'@ Grab'它看起來像什麼(因爲btw?)所以在Spy中,一個必須在'then'部分指定結果? – Liv

+0

你有一個鏈接,你從哪裏得到?到目前爲止,我一直無法找到關於Spock的這類東西:( – Liv

+0

葡萄('@ Grab')是groovy腳本的依賴關係解析器,您可以將腳本保存爲lol.groovy並運行它,確切地說,如果你驗證*它們 - 檢查交互 – Opal