この場合、2つの側面があります。
- ユニットテスト。これらは非常に高速であることが意図されています(テストスイート全体を数秒で実行します)。彼らはあなたのコードの非常に小さなチャンク、つまり1つのメソッドをテストします。このような粒度を実現するには、Mockitoを使用して環境全体をモックする必要があります。あなたは興味がありません:
- EntityManagerを呼び出し、エンティティをデータベースに配置します。
- トランザクションのテスト、
- 非同期呼び出しを行う、
- JMSエンドポイントのヒットなど。
この環境全体をモックして、各メソッドを個別にテストします。ユニットテストはきめ細かく、非常に高速です。これは、コードに重要な変更を加えるたびに実行できるためです。それらがより複雑で時間がかかる場合、開発者は「テスト」ボタンをそれほど頻繁に押すことはありません。
- 統合テスト。モジュール間の統合をテストしたいので、これらは遅くなります。それらが互いに適切に「話し合う」かどうかをテストしたい、すなわち:
- トランザクションは期待どおりに伝播されますか?
- トランザクションをまったく行わずにビジネスメソッドを呼び出すとどうなりますか?
- WebServicesクライアントから送信された変更は、実際にエンドポイントメソッドに影響を与え、データベースにデータを追加しますか?
- JMSエンドポイントがApplicationExceptionをスローした場合はどうなりますか?すべての変更を適切にロールバックしますか?
ご覧のとおり、統合テストは大まかなものであり、コンテナー内で(または基本的には本番環境のような環境で)実行されるため、はるかに低速です。これらのテストは通常、コードが変更されるたびに開発者によって実行されることはありません。
もちろん、Java SEでJPAを実行できるのと同じように、EJBコンテナを組み込みモードで実行できます。重要なのは、人工的な環境が基本的なサービスを提供しているということですが、それを微調整することで終わり、実際のコンテナーよりも柔軟性が低くなります。
Arquillianを使用すると、選択したコンテナーで実稼働環境を作成し、この環境でテストを実行することができます(データソース、JMS宛先、および実稼働環境で見られると予想されるその他の多くの構成を使用)。
それが役に立てば幸い。