2012-01-27 124 views
47

是否有可能在代碼中告訴給定的對象是否爲Mockito模擬?如何判斷對象是否爲Mockito模擬?

我想這樣做的原因是當它使用模擬時返回一個不同的錯誤信息。這將被用於向其他開發者建議他們應該使用預先準備好的模擬,該模擬已經被設置爲以有用的方式應答呼叫而不是自己創建模擬。

目前我所擁有的最好的是object.getClass().getName().contains("EnhancerByMockitoWithCGLIB")但這感覺很不好。

回答

45

貌似沒有這樣的API(請提出一個問題,是應該的!)幸運(按照以下說明您的評論)沒有在org.mockito.internal.util包的方法:

import org.mockito.internal.util.MockUtil; 

new MockUtil().isMock(obj) 

今後Mockito.isMock()方法可能會添加到公共API,請參閱:Issue 313: Provide isMock outside of org.mockito.internal)

+3

繼續從你的回答中,我看了一下[MockUtil的源代碼](https://fisheye2.atlassian.com/browse/mockito/trunk/src/org/mockito/internal/util/MockUtil.java? r = 2020)並直接在私有的'isMockitoMock'方法下有一個公共'isMock'方法,它似乎可以使用。我將在Mockito郵件列表上發帖以檢查自己是否從'org.mockito.internal.util'調用方法是一個好主意。 – mikej 2012-01-27 17:28:37

+0

'org.mockito.internal.util'軟件包的意圖之一是Mockito團隊可以設想在這個軟件包中更新任何新版本。所以如果你使用這個軟件包,你的測試可能會在未來發生。然而,我們不太可能擺脫這種特殊的方法,所以我會說它使用起來相當安全。 – 2012-01-27 18:32:54

+0

@mikej:+1,不知何故,我錯過了那個,謝謝!我刪除了舊的答案,並提出了你的建議,所以它更好的脫穎而出。希望你不介意。 – 2012-01-27 18:33:03

32

作爲後續行動,在公衆的Mockito API現在有這個方法:

MockingDetails org.mockito.Mockito.mockingDetails(Object toInspect) 

這是@大衛華萊士提出的問題的結果。返回的對象支持方法'isMock()'以及'isSpy()',並可能在以後增強以提供更多模擬相關信息。