Tomcat サーブレット コンテナーの下で多数のサーブレットを実行しています。テストコードと本番コードを分けたいので、テストフレームワークの利用を検討しました。JUnit は Eclipse にうまく統合されていますが、実行中の Tomcat サーバーを使用してサーブレットを実行することはできませんでした。Tomcat サーブレットのテストをサポートする単体テスト フレームワークを推奨していただけますか? Eclipse との統合は便利ですが、必須ではありません。
6 に答える
HttpUnit の一部であるServletUnitを確認してください。簡単に言うと、ServletUnit は、通常の JUnit テストで使用できるモックとユーティリティのライブラリを提供し、サーブレット コンテナや、リクエスト オブジェクトやレスポンス オブジェクトなどの他のサーブレット関連オブジェクトをモック アウトします。上記のリンクには例が含まれています。
Spring Framework には、サーブレット API からのいくつかのクラス用のすぐに使用できるモック オブジェクトがあります。
わかった。「tomcat」ビットを無視してサーブレットにコーディングする場合、最善の策は、応答オブジェクトと要求オブジェクトのモックを作成し、そこから何を期待するかを伝えることです。
したがって、標準の空の doPost の場合、EasyMockを使用すると、
public void testPost() {
mockRequest = createMock(HttpServletRequest.class);
mockResponse = createMock(HttpServletResponse.class);
replay(mockRequest, mockResponse);
myServlet.doPost(mockRequest, mockResponse);
verify(mockRequest, mockResponse);
}
次に、doPost へのコードの追加を開始します。モックは期待値がないため失敗しますが、そこから期待値を設定できます。
クラスで EasyMock を使用する場合は、EasyMock クラス拡張ライブラリを使用する必要があることに注意してください。しかし、それ以降は同じように機能します。
HTTP 要求と応答を処理するコードの部分を、ビジネス ロジックまたはデータベース操作を行う部分から分離します。ほとんどの場合、これにより、データ層 (データベース/永続性用)、サービス層 (ビジネス ロジック用)、およびプレゼンテーション層 (HTTP 要求と応答用) の 3 層アーキテクチャが生成されます。
- サーブレットをまったく使用せずに、最初の 2 つのレイヤーを単体テストできます。その方法でテストする方が簡単です。
- 他の人が示唆しているように、モック HTTP 要求および応答オブジェクトを使用して、プレゼンテーション レイヤーをテストできます。
- 最後に、本当に必要な場合は、HtmlUnitやJWebUnitなどを使用して統合テストを実行できます。
「コンテナ内」のテストについては、Cactusをご覧ください。
実行中のコンテナーなしでテストできるようにしたい場合は、独自のモックオブジェクト ( EasyMock など) を使用してそのコンポーネントをシミュレートするか、サーブレット、jdbc 接続などをテストするための「事前定義された」スタブを持つMockRunnerを試すことができます。
2018 年 2 月更新: OpenBrace Limited は閉鎖され、その ObMimic 製品はサポートされなくなりました。
サーブレットの JUnit テスト用に ServletUnit の新しい代替手段が必要な場合は、私の会社のObMimicライブラリが役立つかもしれません。Web サイトのダウンロードページから無料で入手できます。
ServletUnit と同様に、サーブレット API をシミュレートするためにサーブレット コンテナの外部で通常の JUnit または TestNG テストで使用できるクラスのライブラリを提供します。
そのサーブレット API オブジェクトには引数のないコンストラクターがあり、関連するすべてのサーブレット API データと設定について完全に構成および検査可能であり、サーブレット API の javadoc によって指定されたすべての動作の完全なシミュレーションを提供します。テストを支援するために、サーブレット API 呼び出しの選択的な記録、コンテナー依存の動作の制御、あいまいな呼び出し (つまり、サーブレット API の動作が完全に定義されていない場所) のチェック、および任意の呼び出しに対するインメモリ JNDI シミュレーションのサポートがあります。 JNDI ルックアップに依存するサーブレット コード。
詳細、サンプル コード、「ハウツー」ガイド、Javadoc などについては、Web サイトを参照してください。