2

CDI-Unit を使用して、依存関係の挿入に CDI を使用している Wicket コンポーネントをテストしようとしています。テストは Eclipse で完全に機能しているように見えますが、Maven ビルド中に失敗し、ヒントや何が問題なのかを見つけることができません。

シンプルな抽象 WicketPanel を作成しました

public abstract class MyPanel extends Panel{

  private static final long serialVersionUID = 4132041261965905788L;

  private final RepeatingView rw;

  @Inject 
  transient ReflectiveComponentFactory factory;

  public MyPanel(String id) {
    super(id);
    rw = new RepeatingView(OVERLAY_COMPONENT_GROUP_ID);
    add(rw);
  }

  @Override
  public <CT extends Component> CT addComponent(Class<CT> componentType) {
    return addComponent(componentType, OVERLAY_COMPONENT_ID);
  }

  protected <CT extends Component> CT addComponent(Class<CT> componentType, String overlayComponentId) {
    WebMarkupContainer collapsableGroup = new WebMarkupContainer(rw.newChildId());
    rw.add(collapsableGroup);

    CT component = factory.createComponent(componentType, overlayComponentId);
    collapsableGroup.add(component);

    return component;
  }
}

そして注射工場:

@ApplicationScoped
public class ReflectiveComponentFactory implements Serializable{
  private static final long serialVersionUID = -4587243549845349456L;

  public <CT extends Component> CT  createComponent(Class<CT> componentType, String componentId){
    try {
      Constructor<CT> constructor = componentType.getConstructor(String.class);
      return constructor.newInstance(componentId);
    } catch (ReflectiveOperationException | SecurityException | IllegalArgumentException e) {
      throw new ComponentCreationException(e);
    } 
  } 
}

次に、CDI-Unit を使用して単体テストを作成します。

@RunWith(CdiRunner.class)
@AdditionalClasses(value={ReflectiveComponentFactory.class})
public class MyPanelTest {
  private WicketTester tester;

  @Inject
  private BeanManager beanManager;

  @Before
  public void setup() {
    tester = new WicketTester();
    new CdiConfiguration(beanManager).setPropagation(ConversationPropagation.NONE).configure(tester.getApplication());
  }

  @Test
  public void testAddComponentWithClass() {
    MyPanelTested myPanel = new MyPanelTested("someId");
    TestPanel panel1 = myPanel.addComponent(TestPanel.class);
    TestPanel panel2 = myPanel.addComponent(TestPanel.class);

    tester.startComponentInPage(myPanel);
    tester.assertComponent(panel1.getPageRelativePath(), TestPanel.class);
    tester.assertComponent(panel2.getPageRelativePath(), TestPanel.class);
    tester.assertComponent(panel1.getPageRelativePath() + ":text", Label.class);
    tester.assertComponent(panel2.getPageRelativePath() + ":text", Label.class);
  }
}

@SuppressWarnings("serial")
class MyPanelTested extends MyPanel {
  public MyPanelTested(String id) {
    super(id);
  }
}

TestPanel は含めていませんが、非常に単純です (そして多かれ少なかれ空です)。

これを Eclipse で実行すると、テストは緑色でパスします。

これをMavenで実行すると、次のようになります。

org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.Dependent
  at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:578)
  at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:608)
  at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:674)
  at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:136)
  at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:763)
  at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:772)
  at org.jboss.weld.manager.SimpleInjectionTarget$1.proceed(SimpleInjectionTarget.java:106)
  at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48)
  at org.jboss.weld.manager.SimpleInjectionTarget.inject(SimpleInjectionTarget.java:102)
  at org.apache.wicket.cdi.NonContextual.postConstruct(NonContextual.java:129)
  at org.apache.wicket.cdi.NonContextualManager.postConstruct(NonContextualManager.java:65)
  at org.apache.wicket.cdi.DetachEventEmitter.<init>(DetachEventEmitter.java:55)
  at org.apache.wicket.cdi.CdiConfiguration.configure(CdiConfiguration.java:196)
  .....

私が間違っていることの手がかりはありますか?

4

1 に答える 1

1

この問題は、cdi-unit バージョン 2.0.8 のバグが原因でした。Bryn が問題を解決したため ( https://github.com/BrynCooke/cdi-unit/issues/21を参照)、cdi-unit 2.0.9 以降を使用している場合は表示されません。

于 2013-06-26T14:21:34.667 に答える