ホイ!
私が発見した問題は非常に理解しやすいですが、解決策が見つかりません。
まず、この小さなスニペットを提供させてください。
@Deployment
public static Archive<?> createDeployableArchive () {
JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "whoCares.jar");
// enable CDI
jar.addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml");
// Some persistence
jar.addAsManifestResource("test-persistence.xml", "persistence.xml");
// Now the interisting part (simplified):
jar.addClass(RegistrationService.class) // This one should be tested
.addClass(RegistrationException.class) // Will be thrown on error.
.addClass(UserDAO.class) // Used by RegService
.addClass(User.class) // JPA Entity
// ...
// ... This scenario goes without interfaces, inheritance, DTOs, different
// ... types of exceptions for different problem types... That's why the list
// ... is so concise.
// ...
.addClass(RegServiceIntegrationTest.class); // Test class must be included
return jar;
}
registerUser などの特定のユース ケースを arquillian でテストするたびに、登録プロセスが依存するすべてのクラスを収集し、デプロイ可能なアーカイブにまとめる必要があります。
これを手動で行うと時間がかかり、問題やエラーが発生することは間違いありません。いくつかの弱点があります。
収集:多くのサブ サービス、例外、インターフェイス、スーパー クラス、ユーティリティなどを含む長いプロセスを考えてみてください。それらをすべて見つけるために、完全なフローを見ていきます。正直なところ、それは繰り返しの長期的な仕事であり、目を痛めるでしょう. 怒鳴り始める前に、ほんの数回それをしなければなりませんでした。
テストを最新の状態に保つ:登録チェーンに新しいサブサービスを含めるとします。これらのいまいましい依存関係を更新する必要があり、1 日の終わりに統合テストを実行したときに何か問題が発生した場合は、不完全な例外メッセージを掘り下げるのが楽しいでしょう (不完全な原因は、ある時点で何かが欠けていることだけを知っているだけで、何が欠けているかはわかりません)。まさに)。運が良ければ ClassNotFoundException が発生します。もちろん、1 つの変更は複数のテストに簡単に影響を与える可能性があります。2. 人生の時間を無駄にします。
パッケージの追加に関する問題: パッケージの追加は Shrinkwrap によって提供されますが、それを使用するのは悪い考えです。長い一日の後に怠惰に感じて完全なパッケージを追加するだけで、すべてのクラスが同じパッケージに永遠に残ることを絶対に確信できますか? もう 1 つの問題は、「マイクロ展開」という用語がコンパクトさの必要性を暗示していることです。パッケージ全体でオーバーヘッドが発生します。これは、ここでの最小の問題だと思います。
これを解決する方法は?
必要なすべての情報がソースコードですでに利用可能であることは、一種の平凡です。
最善の解決策は次のようなものです。
@Deployment
public static Archive<?> createDeployableArchive () {
JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "whoCares.jar");
// enable CDI
jar.addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml");
// Some persistence
jar.addAsManifestResource("test-persistence.xml", "persistence.xml");
Class<?>[] involved;
involved = Tool.findInvolvedClasses("RegistrationService.java", "registerUser");
jar.addClasses(involved);
return jar;
}
正確な「フロー」を知る必要があるため、リフレクションを使用してこれを達成できるとは思いません。
意図しない用途に使用できるクールなツールがあるに違いありません。もちろん他の方法もあるかもしれません。誰かがアイデアを持っていますか?ありがとう!