問題タブ [cdi-unit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Activiti CDI / Weld SE / CDIユニット
純粋な CDI を使用して Activiti / BPMN プロセスをテストしようとした人はいますか? 理論的には(何も見逃していなければ)f.exを使用できるはずだと思います。activiti-engine および activiti-cdi と共にプロセスをテストするためのcdi-unit 。CDIユニットは内部でweld-seを使用しています。
しかし、私はそれを機能させることができませんでした。その理由は、Activiti CDI と CDI ユニットが異なるコンテキストで動作するためだと思います。それらを「結合」する方法がわかりませんでした (または、おそらく不可能です)。
@RunWith(CdiRunner.class) で注釈が付けられたテストで ProcessEngine で @Inject を使用しても ( CDI ユニットのクイックスタートのように)、何も「トリガー」されませんでした。つまり、Activiti または ProcessEngine は変更されませんでした。
java - 期待される?CDI Request スコープ Bean がプロデューサーに注入され、依存する Bean に注入されると、WELD-001303: アクティブなコンテキストがありません
RequestScope がアクティブであると仮定します (cdi-unit の @InRequestScope を使用)
与えられた
- そのアクティブなリクエストスコープへの製品の注入
- 依存プロデューサーを使用する (InjectionPoint パラメーターを使用するため、依存する必要があります)
- そのプロデューサーには、リクエストスコープのBeanを注入する必要があります
これが失敗した場合、リクエスト スコープ Bean の原因
- これは CDI ごとに予想される動作ですか?
- はいの場合、プロデューサーの依存疑似スコープのためですか?
- SomeCache がリクエスト スコープではなくアプリケーション スコープである場合、これが失敗しないのはなぜですか?
SomeCache の妥当な範囲のソリューションは何ですか?
その (動作していない) リクエスト スコープの SomeCache は、プロデューサーが最初に注入される Bean を生成するために必要なデータをキャッシュします。だからできる
- どちらにも依存しない (キャッシュが役に立たなくなるため)
- また、アプリケーション スコープまたは静的であってはなりません (スコープが広すぎる)。
理想的には、Product が注入される Bean の同じスコープに自動的にある必要があります (例では、ExpectedTest です)。別のカスタム cdi スコープである可能性がありますが、そのスコープを定義するクライアント/ユーザー開発者に依存するべきではありません。意味があれば、それを「推移的なスコープ依存 Bean」と呼ぶことができます。
java - public private フィールドのパラドックスのため、Junit @Rule を使用した CdiUnit テストは不可能です
私の問題を再現するには、次のスニペットで十分です。
thrown
属性を設定しpublic
てエラーを取得するかorg.jboss.weld.exceptions.DefinitionException: WELD-000075: Normal scoped managed bean implementation class has a public field
public
または、修飾子を削除してエラーが発生しますorg.junit.internal.runners.rules.ValidationError: The @Rule 'thrown' must be public.
public
また、修飾子を配置し@Dependent
て、クラスに注釈スコープを追加しようとしましたが、エラーが発生しましたorg.jboss.weld.exceptions.DefinitionException: WELD-000046: At most one scope may be specified on [EnhancedAnnotatedTypeImpl] public @Dependent @ApplicationScoped @RunWith
不要なコードをすべて取り除きましたが、これは非常に複雑な単体テストであり、モック、CDI によるサービス インジェクション、および例外をスローすることが予想されるいくつかのテスト メソッドを使用しています。
したがって、私の問題は、一方でWeldはクラスをプロキシ化できないため、すべてのフィールドをパブリックにしないことを望んでおり、他方では、JUnitはリフレクションを使用してアクセスしているためRuleフィールドをパブリックにしたいということです。setAccessible(true)
セキュリティ マネージャがアクティブな場合があるため、このメソッドを使用したくありません。そのパラドックスにどう対処するか?
注意:この回答に対するヒントコメントも見つかりました。
@Rule でメソッドにアノテーションを付けることもできるので、これにより問題を回避できます
しかし、メソッドに注釈を付けたjunitテストの例は見つかりませんでした@Rule
。これについては別の質問をする予定です。