1

まず、私は集中的にグーグルで検索し、 http://jglue.org/cdi-unit-user-guide/によると、単体テストで注入するものを作成するとうまくいくはずです。

私のセットアップ:

@RunWith(CdiRunner.class)
public abstract class CdiUnitBaseTest extends DBUnitBaseTest {
  @Produces
  public EntityManager em() {
    return em; //field from base class filled @BeforeClass
  }
  @Produces
  public Logger logger() {
    return LogManager.getLogger();
  }
}

public class SurveyBeanTest extends CdiUnitBaseTest {

  @Inject
  private SurveyBean bean;

  @Test
  public void surveyWithoutParticipation() {
    Survey s = new Survey();
    s.setParticipation(new ArrayList<Participation>());
    boolean result = this.bean.hasParticipated("12ST", s);

    Assert.assertFalse(result);
  }
}

@Remote(SurveyRemote.class)
@Stateless
public class SurveyBean implements SurveyRemote {

  @Inject
  private Logger log;
  @Inject
  private SurveyDao sDao;
  @Inject
  private ParticipationDao pDao;

  ...
}

例外:

org.jboss.weld.exceptions.DeploymentException: 3 つの例外を含む例外リスト:

例外 0 : org.jboss.weld.exceptions.DeploymentException: WELD-001408: インジェクション ポイント [BackedAnnotatedField] で修飾子 @Default を持つタイプ Logger の満たされていない依存関係 [BackedAnnotatedField] @Inject private at.fhhagenberg.unitTesting.beans.SurveyBean.log ...

これは、CdiRunner が SurveyBean を構築してロガーを注入しようとするが、注入するオブジェクトを見つけられないことを意味しますが、具体的には基本クラスで生成します (EntityManager についても同様です)。

誰でもこれを修正する方法を知っていますか?

PS: 追加を許可されていないタグ: cdi-unit、jglue

4

1 に答える 1

2

プロデューサー メソッドを DBUnitBaseTest とは別のクラスに配置する必要があります。このクラスは抽象クラスであり、CDI プロデューサーとして使用することはできません。em と logger の両方のプロデューサー メソッド。

これは、プロデューサー メソッド/フィールドを持つクラスが CDI Bean である必要があるためです。そのクラスのインスタンスは、プロデューサー メソッドを呼び出す前に CDI によって作成されます。また、CDI は抽象クラスから Bean を作成できません。また、@Producerアノテーションは継承されないため、継承されたメソッドはSurveyBeanTestプロデューサーとして扱われません。

于 2015-10-07T07:02:39.983 に答える