简体   繁体   中英

Unit test with WicketTester and CDI-Unit works in Eclipse but fails during Maven build. What am I missing?

I am trying out using CDI-Unit to test my Wicket components, which are using CDI for dependency injection. Tests seems to work perfectly in Eclipse but fail during my Maven build and I cant seem to find any hints and what is wrong.

I have created a simple abstract 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;
  }
}

And the injection factory:

@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);
    } 
  } 
}

And then created a unit test using 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);
  }
}

I have not included TestPanel, but it is extremely simple (and more or less empty).

When I executed this in Eclipse, the test passes with green!

When I execute this with Maven I get the following:

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)
  .....

Any clues to what I am doing wrong?

The problem was caused by a bug in cdi-unit version 2.0.8. Bryn solved the problem (see https://github.com/BrynCooke/cdi-unit/issues/21 ) and it should therefore not appear if using cdi-unit 2.0.9 or greater.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM