2

我正在尝试使用 CDI-Unit 来测试我的 Wicket 组件,这些组件使用 CDI 进行依赖注入。测试似乎在 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 回答