2015-08-19 110 views
1

使用Spock框架進行java單元測試。 當單元測試方法方法1()和方法1被調用的方法方法2(),在方法2(),其具有如下代碼語句:嘲笑函數調用

Config config = new Config(); 
TimeZone tz=TimeZone.getTimeZone(config.getProps().getProperty(Constants.SERVER_TIMEZONE)); 

呼叫config.getProps().getProperty(Constants.SERVER_TIMEZONE)

返回America/Cambridge_Bay

在getProps方法中,屬性文件是從weblogic域中獲取的,並且它在spcok中不可用,其獲取路徑爲null。

請建議這個函數調用如何在spock中被模擬。

+0

你真的能想出一個完整的例子嗎? –

回答

0

我們可以使用元類注入來模擬單元測試給定塊中的響應方法2。這裏ClassName是method2所屬的類。

ClassName.metaClass.method2 = { inputParameters -> 
     return "America/Cambridge_Bay" 
    } 

而且最好是使用@ConfineMetaClass([ClassName])註釋的單元測試,以限制類元注射改變你的測試用例。

0

讓我們開始與模擬的狀況的一個例子:

class Config { 
    Properties getProps() { 
     def props = new Properties() 

     props.setProperty(Constants.SERVER_TIMEZONE, 'America/Cambridge_Bay') 
     props 
    } 
} 

class Constants { 
    static String SERVER_TIMEZONE = 'TIMEZONE' 
} 

Config config = new Config() 

def timeZoneID = config.getProps().getProperty(Constants.SERVER_TIMEZONE) 
def tz = TimeZone.getTimeZone(timeZoneID) 
assert tz.ID == 'America/Cambridge_Bay' 

由於方法2()沒有得到一個配置實例注入其中,模擬的功能出了問題。因此,我們將在類級別使用Groovy的metaClass(因爲出於同樣的原因,實例級別也不存在)。您可以覆蓋Config.getProps()這樣的:

Config.metaClass.getProps { 
    def props = new Properties() 

    props.setProperty(Constants.SERVER_TIMEZONE, 'Etc/UTC') 
    props 
} 

所以,你可以大致寫你斯波克測試是這樣的:

// import Constants 
// import Config class 

class FooSpec extends Specification { 

    @ConfineMetaClassChanges 
    def "test stuff"() { 
    when: 
    Config.metaClass.getProps { 
     def props = new Properties() 

     props.setProperty(Constants.SERVER_TIMEZONE, 'America/Cambridge_Bay') 
     props 
    } 

    // Do more stuff 

    then: 
    // Check results 
    } 
} 

PS

如果你可以修改方法2()要注入Config,那麼您可以使用Groovy的MockFor,這樣會更好。