2014-02-27 32 views
2

我有一個DAO和一個服務類。在服務等級CapService,我@Autowired DAO類CapDAO的參考。 CapDAO類有一個私有類型爲int的實例字段,它具有使用@Value註釋從屬性文件注入的值。爲不同場景配置模擬對象的狀態

class CapDAO { 
    @Value("${someProperty}") 
    private int expiryTime; 
} 

class CapService { 
    @Autowired 
    private CapDAO capDAO; 
} 

有一種方法 - 在CapDAO類,它從數據庫中檢索的帽,基於所述expiryTimeretrieveCap()。該方法是從CapService類中的另一種方法調用的。

CapService類使用從DAO方法返回的列表創建另一個包裝該列表的對象。最後它返回那個數據結構。

現在,我正在使用Mockito框架測試場景。我有兩種情況。在他們兩個中,我想調用CapService類的方法,這會使我成爲對象。列表檢索表格數據庫將取決於CapDAO類中expiryTime的值。對象的內容也將由CapService類方法返回。

在測試中,我調用Service類中的方法,並檢查返回的值。由於DAO正在從屬性文件中讀取expiryTime,因此兩個測試場景都無法傳遞相同的配置值。我必須將兩個不同配置的DAO實例注入Service類。

所以,我的問題是 - 有什麼辦法,我可以配置expiryTimeCapDAO類,創建兩個不同的情況下,也可以在只有一個實例,並注入那些CapService基於情景?不,我沒有任何設置expiryTime。是的,我知道我可以使用反射,但我想保留這作爲我的最後手段。

+0

澄清:一個測試類,兩個測試,每個測試都有一個不同的'expiryTime'值? –

+0

@SotiriosDelimanolis是的。我想我應該把一個測試移動到另一個班級,對嗎? –

+0

也許吧。畢竟你確實有一個測試_suite_。如果您還沒有,請查看'@ DirtiesContext',但您仍然需要找到一種有效的方法來加載不同的屬性值。 –

回答

1

簡短的回答

反射最簡單的可能性,你可以簡單地使用ReflectionTestUtil。注:如果您有CapDAO實現一個接口,您也需要AopUtils

龍答案

如果你不想使用反射,則需要分開你的環境和測試,以得到這個工作:

// context1.xml 
<context:property-placeholder location="classpath:test1.properties"/> 
// context2.xml 
<context:property-placeholder location="classpath:test2.properties"/> 

然後,您可以在屬性中定義someProperty以及其他值。

我個人會推薦反思。

+0

我想用'ReflectionTestUtils'而不是標準Java反射,但後來我認爲最好添加'setters',因爲另一種方法不是我所需要的。儘管感謝您的回答。 –