Blog

Pythonのpatch.objectについて

この記事は、ニフティグループ Advent Calendar 2025 20日目の記事です。

はじめに

こんにちは。ニフティの並木です。
今回は、Pythonのpatch.objectについてご紹介します。

・本記事の動作確認環境:Python 3.13
・公式ドキュメント:https://docs.python.org/ja/3.13/library/unittest.mock.html

patch.objectとは

patch.object は、Pythonのオブジェクト(インスタンスやクラス)の一部を、一時的にモックに置き換える機能で、テストの時に活用することができます。

具体的なテストコードを見ていきます。

本来、_get_latest_record というメソッドは、実際にDB見に行って「最後に保存されたファイル名」を探してくる複雑な処理を行っています。

しかし、今回のテストでやりたいことは「DBに該当レコードが無い時の挙動」を確かめることです。
実際にDBを空にするのは大変ですし、他のテストに影響が出てくるかもしれません。
そこで、patch.object を使い「このテストの間だけ、_get_latest_record は何も考えずに None を返すようにして」 と命令しているのです。

with ブロックを使っている理由は、「テストが終わったら、_get_latest_record をモックオブジェクトから、本物に戻すため」 です。
with ブロックを抜けると、モックオブジェクトに置き換わっていたメソッドが、自動的に元の本物のメソッドへと戻されます。

patch.object の書き方

  • 第1引数 : ターゲットとなるインスタンスそのものを渡します。今回はインスタンスを渡していますが、クラスを渡すこともできます。
  • 第2引数 : 置き換えたいメソッドの名前を「文字列」で指定します。メソッド名を打ち間違えても、実行するまでエラーに気づきにくいため注意が必要です。
  • return_value: そのメソッドが呼ばれたときに、何を返してほしいかを指定します。上の例ではNoneを設定していました。

おわりに

Pythonのpatch.objectについてご紹介しました。
テストコード作成の際にぜひ利用してみてください。

また、デコレータを使ってモックオブジェクトを作る方法もあるそうです。機会があればこちらも使ってみたいと思います。
※公式ドキュメント:https://docs.python.org/ja/3.13/library/unittest.mock-examples.html#patch-decorators


明日は、nemu_nemu_musashi さんの「デスクトップマスコットを作りたい」です。お楽しみに!

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!