Pythonのunittestライブラリには、テスト対象のシステムの一部をモックオブジェクトに置き換えて使用することができます。これにより、テストスイート全体でスタブを作成する必要がなくなります。
以下に、Pythonのunittestでmockを使用する基本的な手順を示します。
Mockの基本的な使用方法
まずは、unittest.mockのMockクラスを使用して、基本的なモックの作成と使用方法を見てみましょう。
from unittest.mock import MagicMock
thing = ProductionClass()
thing.method = MagicMock(return_value=3)
thing.method(3, 4, 5, key='value') # Returns: 3
thing.method.assert_called_with(3, 4, 5, key='value')
上記のコードでは、ProductionClass
のmethod
をモック化し、その戻り値を3に設定しています。その後、method
を呼び出し、その呼び出しが期待通りであることを確認しています。
Mockと例外
Mockオブジェクトは、呼び出し時に例外を発生させることもできます。これは、side_effect属性を使用して設定できます。
from unittest.mock import Mock
mock = Mock(side_effect=KeyError('foo'))
mock() # Raises: KeyError: 'foo'
上記のコードでは、mockオブジェクトが呼び出されるとKeyError
が発生します。
モジュールやクラスのMock化
unittest.mockは、テスト中にモジュールやクラスのオブジェクトをモックに置き換えるためのpatchデコレータも提供しています。
from unittest.mock import patch
@patch('module.ClassName2')
@patch('module.ClassName1')
def test(MockClass1, MockClass2):
module.ClassName1()
module.ClassName2()
assert MockClass1 is module.ClassName1
assert MockClass2 is module.ClassName2
assert MockClass1.called
assert MockClass2.called
test()
上記のコードでは、module.ClassName1
とmodule.ClassName2
がテストの間、それぞれMockClass1
とMockClass2
に置き換えられます。テストが終了すると、元のオブジェクトに戻ります。
以上がPythonのunittestとmockの基本的な使用方法です。これらの機能を活用することで、より効率的なテストコードの作成が可能になります。