2013-10-09 96 views
0

我在服務類中有一個靜態地圖。我正在單元測試填充地圖的方法。我想知道如何模擬服務類中使用的地圖。如何在grails服務類單元測試中模擬靜態地圖屬性

SomeService 
-------------- 

class SomeService { 
    static Map<Integer,String> tempMap = new HashMap<Integer,String>() 
     //This map is used in some other service api 
} 

OtherService 
------------ 

class OtherService { 
    void method1(Integer i, String str) { 
     // here it populates the map 
     def test = SomeService.tempMap.put(i,str) 
     println "After putting : "+test 
    } 
} 

單元測試用例

OtherServiceTests 
------------------ 
class OtherServiceTests { 
    void testMethod1() { 
     def mockedMap = mockFor(Map) 
     SomeService.metaClass.static.tempMap = mockedMap.createMock() 
     SomeService.metaClass.static.tempMap.put = {Integer i, String str -> "Testing"} // how to mock?? 
    } 
} 

當我運行正在調用的實景地圖,而不是利用嘲笑"put" API,它返回null而不是「測試」的 我測試用例嘗試了幾種方法來嘲笑它,但仍然沒有運氣。如何模擬Map api這是一個服務類的static屬性?

+2

Grails服務是單身,所以你不應該存儲在其中的狀態(只聲明方法)。 –

+0

@SérgioMichelsMichels我想從不同的地方訪問這張地圖。涉及多個投放和獲取操作。如果以這種方式訪問​​地圖,會不會產生問題? Service1將填充地圖。 Service2將從map獲取信息。請告知。 – user2001627

+0

100%會造成問題。正如他所說,服務是單身的,因此他們維持狀態。無論哪個全球範圍內的服務領域都可以在無狀態的請求中使用,這將導致錯誤的結果。非常不鼓勵在服務中添加範圍變量。您可以嘗試使用符合您的要求的其他服務範圍,或放棄在服務級別中使用靜態全局地圖的想法。 – dmahapatro

回答

1

對於嘲諷你可以嘗試

SomeService.tempMap.getClass().metaClass.put = {Integer i, String str -> "Testing"} 
+0

感謝工作就像一個魅力!!我錯過了'getClass()'。指出它。 – user2001627

相關問題