讓我們開始與模擬的狀況的一個例子:
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,這樣會更好。
你真的能想出一個完整的例子嗎? –