![](/img/trans.png)
[英]Mocked objects turns null in service calls. They are available as mocked object in Test class but when reaches service class there all mocks' are null
[英]Mockito mocks refers to all object of the mocked class?
我正在用 Mockito 測試我的代碼,我使用過:
RequestWrapper requestWrapper = mock(RequestWrapper.class);
我認為它模擬了 RequestWrapper.class 的requestWrapper 實例。
相反,當我在被測系統的代碼中調試時:
RequestWrapper a = new RequestWrapper(request);
RequestWrapper b = new RequestWrapper(request);
RequestWrapper c = new RequestWrapper(request);
我發現 RequestWrapper 的a、b、c實例都被模擬了。 所以看起來 Mocked 類的實例名稱(不是我想出來的模擬 Object !)根本不重要。
所以,我的問題是:
對不起,我錯了。 只有顯式模擬的實例才會成為模擬。 其他是真實類的對象。 由於真實類中的所有其他模擬依賴項,我也出錯了。
因此,如果我模擬一個類的實例,則該類的所有其他實例都被實例化為模擬,這是不正確的。 它們是真正的類的對象。
感謝您提供有用的答案,我為錯誤道歉。
你對模擬的假設是不正確的。
當您的測試代碼實例化新對象( new RequestWrapper()
)時,不會使用使用Mockito.mock()
創建的Mockito.mock()
(除非您使用例如 Powermock 模擬構造函數,但那是另一回事)。
正如其他答案所概述的那樣:你嘲笑錯了。
問題的關鍵是:你不想嘲笑一類的“所有”實例。 相反:您只在必要時創建模擬對象。 有模擬的是一個意思,使其更容易(或可能的!)來測試特定的代碼塊。 換句話說:模擬允許您控制該代碼段中使用的某些內容。
因此,您只對控制“被測代碼”將使用的特定對象感興趣。
你絕對不想當您使用來控制每類X的任何實例mock(X.class)
或@Mock X x
某處你的單元測試!
是的,當你有
X mock1 = mock(X.class);
X mock2 = mock(X.class);
那么您需要為這兩個對象分別指定when().then()
或verify()
規范(以防 mockito 提供的默認行為不夠用)。 這又是我上面寫的結果:你應該完全清楚“哪個”模擬“去哪里”。
在被測方法中使用的每個單獨的 RequestWrapper 對象都必須使用Mockito.mock()
或使用@Mock
注釋獨立創建。
然后它們中的每一個都必須使用when().then()
語法獨立設置。
如果您在一個測試方法中使用同一類的多個mock(Class<T> classToMock, String name)
,那么mock(Class<T> classToMock, String name)
將有助於調試或斷言失敗日志記錄。
對不起,我錯了。 只有顯式模擬的實例才會成為模擬。 其他是真實類的對象。 由於真實類中的所有其他模擬依賴項,我也出錯了。
因此,如果我模擬一個類的實例,則該類的所有其他實例都被實例化為模擬,這是不正確的。 它們是真正的類的對象。
感謝您提供有用的答案,我為錯誤道歉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.