2014-02-17 86 views
2

我正在整合mockito與python unittest。我是單元測試新手,但對於單元測試範式來說當然不是新手。我想用mockito來扼殺和嘲笑課程。 我找不到任何有關mockito python-unittest集成和用法的好文檔。集成python mockito與python unittest

mockito是最好的方式嗎?

它有什麼含義?

任何人都可以指導我嗎?

+0

是有一個原因,你不想使用[mock](http://www.voidspace.org.uk/python/mock/)庫?它是從Python 3.3(unittest.mock)開始的標準單元測試庫的一部分。 – msvalkon

+0

我正在使用python 2.6&2.7 –

+1

沒關係,你可以'pip install mock'。問題的關鍵在於,由於它已經足夠成熟,可以包含在python 3.3的標準庫中,所以你可能會遇到更少的問題,並且有更多的人來回答你的問題。 – msvalkon

回答

0

我發現模擬文檔比mockito更容易理解。它現在是標準庫的一部分。

python mockito lilbrary正試圖改造Java mockito庫。因此,對於使用Java和Python的人員同時使其更容易,這是非常有用的。如果你不再使用Java mockito,我就沒有理由走這條路。

可能你的答案是使用模擬,因爲你問「mockito是最好的方式嗎?」

從文檔:http://www.voidspace.org.uk/python/mock/getting-started.html#using-mock


下面的簡單ProductionClass具有更緊密的方法。如果它被一個對象調用,那麼它會調用close對象。

>>> class ProductionClass(object): 
...  def closer(self, something): 
...   something.close() 
... 

因此,爲了測試它,我們需要傳遞一個關閉方法的對象並檢查它是否被正確調用。

>>> real = ProductionClass() 
>>> mock = Mock() 
>>> real.closer(mock) 
>>> mock.close.assert_called_with() 

通常你要跟蹤,而不是一個方法的單個調用更多。 mock_calls屬性記錄對模擬的子屬性的所有調用 - 也記錄其子對象。

>>> mock = MagicMock() 
>>> mock.method() 
<MagicMock name='mock.method()' id='...'> 
>>> mock.attribute.method(10, x=53) 
<MagicMock name='mock.attribute.method()' id='...'> 
>>> mock.mock_calls 
[call.method(), call.attribute.method(10, x=53)] 

如果你做出mock_calls任何意想不到的方法斷言已經被調用,然後斷言將失敗。這很有用,因爲除了斷言您預期的呼叫已經完成之外,您還在檢查它們是否按正確的順序並且沒有額外的呼叫:

您使用呼叫對象構造列表以便與mock_calls:

>>> expected = [call.method(), call.attribute.method(10, x=53)] 
>>> mock.mock_calls == expected 
True 

設置一個模擬對象的返回值是很輕鬆:

>>> mock = Mock() 
>>> mock.return_value = 3 
>>> mock() 
3 

當然,你可以做方法相同在模擬:

>>> mock = Mock() 
>>> mock.method.return_value = 3 
>>> mock.method() 
3 

返回值也可以在構造函數中設置:

>>> mock = Mock(return_value=3) 
>>> mock() 
3 

如果你需要一個屬性上的模擬設定,只要做到這一點:

>>> mock = Mock() 
>>> mock.x = 3 
>>> mock.x 
3