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
屬性?
Grails服務是單身,所以你不應該存儲在其中的狀態(只聲明方法)。 –
@SérgioMichelsMichels我想從不同的地方訪問這張地圖。涉及多個投放和獲取操作。如果以這種方式訪問地圖,會不會產生問題? Service1將填充地圖。 Service2將從map獲取信息。請告知。 – user2001627
100%會造成問題。正如他所說,服務是單身的,因此他們維持狀態。無論哪個全球範圍內的服務領域都可以在無狀態的請求中使用,這將導致錯誤的結果。非常不鼓勵在服務中添加範圍變量。您可以嘗試使用符合您的要求的其他服務範圍,或放棄在服務級別中使用靜態全局地圖的想法。 – dmahapatro