簡體   English   中英

Mockito 模擬是指模擬類的所有對象?

[英]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 !)根本不重要。

所以,我的問題是:

  • 如果當您使用Mockito.mock()時,模擬類的實例(定義特定的實例名稱)有什么意義?
  • 另一個是,如果我想定義模擬實例的不同行為,我是否必須在測試中聲明實例的正確名稱,以便使用when().then()定義不同的行為?

編輯:更新

對不起,我錯了。 只有顯式模擬的實例才會成為模擬。 其他是真實類的對象。 由於真實類中的所有其他模擬依賴項,我也出錯了。

因此,如果我模擬一個類的實例,則該類的所有其他實例都被實例化為模擬,這是不正確的。 它們是真正的類的對象。

感謝您提供有用的答案,我為錯誤道歉。

你對模擬的假設是不正確的。

當您的測試代碼實例化新對象( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM