私の問題を再現するには、次のスニペットで十分です。
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 によるサービス インジェクション、および例外をスローすることが予想されるいくつかのテスト メソッドを使用しています。
import org.jglue.cdiunit.CdiRunner;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
@RunWith(CdiRunner.class)
public class FooBarTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void test() {
}
}
したがって、私の問題は、一方でWeldはクラスをプロキシ化できないため、すべてのフィールドをパブリックにしないことを望んでおり、他方では、JUnitはリフレクションを使用してアクセスしているためRuleフィールドをパブリックにしたいということです。setAccessible(true)
セキュリティ マネージャがアクティブな場合があるため、このメソッドを使用したくありません。そのパラドックスにどう対処するか?
注意:この回答に対するヒントコメントも見つかりました。
@Rule でメソッドにアノテーションを付けることもできるので、これにより問題を回避できます
しかし、メソッドに注釈を付けたjunitテストの例は見つかりませんでした@Rule
。これについては別の質問をする予定です。