7

私の問題を再現するには、次のスニペットで十分です。

  • 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。これについては別の質問をする予定です。

4

1 に答える 1

16

問題を解決する方法がわかりました。今後の参考のために、これが機能するスニペットです。これが他の人に役立つことを願っています。

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 {

    private ExpectedException thrown = ExpectedException.none();

    @Rule
    public ExpectedException getThrown() {
        return thrown;
    }

    @Test
    public void test() {
        thrown.expect(ArithmeticException.class);
        int i = 1 / 0;
    }
}
于 2016-10-21T12:24:29.557 に答える