2021.10.15この記事は約8分で読めます。概要スタブを作成して、DIに注入することで「API呼び出しの処理をテスト時はスタブに置き換える」を達成します。匿名クラス・ラムダ式の使い方とかも簡単にですが、説明します。執筆時点でJava歴・プログラマ歴共に約1年のペーペーです。いい書き方とかいっぱいあると思うので、全て鵜呑みにしてはいけません。※間違いなどあればご指摘いただけると幸いです。本件説明用にプロジェクトを作りました。基本的にはどのようなディレクトリでも動作しますので、お好きな構成にしてみてください。}}ただのコントローラです。GETリクエストに対して、サービスクラスから取得した文字列を返しています。}}コントローラから呼び出されるサービスクラスです。実際にAPIをコールするクラスのインスタンスをDIして呼び出した結果を返却しています。"callAPIメソッドを実行しました。}}具体的なAPIコール処理などを割愛していますが、APIを叩いた結果が文字列の“callAPIメソッドを実行しました。expected;上記の部分で簡易的にですが、CallAPIService型のスタブを作成しています。※業務レベルではもっとスタブに機能を持たせる必要がありますが、今回は割愛。※ラムダ式で実装できるのは、実装したいインターフェースがSAM(単一の抽象メソッドを保持するインターフェース)の場合です。実装したいインターフェースがSAMでない場合や、ラムダ式によるインターフェースの実装が得意でない場合は、以下のような書き方をしましょう。}};どちらもやっていることは一緒です。具体的には、CallAPIServiceインターフェースを実装したクラスのインスタンスを生成している。続いて以下の処理でサービスのDIに上記処理で作成したスタブのインスタンスを注入します。stub;これで、TestServiceImplが呼び出すCallAPIServiceのインスタンスは、スタブに書き換えられました。※もし、注入対象のフィールドがprivateなフィールドだった場合、本記事では紹介しませんが、リフレクションを使うなどすれば対応できるかと思います・・・。最後に以下のアサーションでスタブが呼び出された場合のみテストが成功する。いう条件に設定しました。service.doProcess());これで、準備は完了です。http://localhost:8080/test結果callAPIメソッドを実行しました。作成した通りの結果となりました。続いてテストを実行するテストは、スタブが呼び出されなければ成功しない仕様でしたね。ご自身のIDEでJUnitを実行してください。「API呼び出しの処理をテスト時はスタブに置き換える」ということが出来ました。上記のスタブに機能追加することで、より実践的なスタブが作成できるようになるかと思います。