2013-05-27 6 views
2

Я пытаюсь использовать CDI-модуль для тестирования компонентов Wicket, которые используют CDI для инъекций зависимостей. Тесты, кажется, отлично работают в Eclipse, но сбой во время сборки Maven, и я не могу найти никаких намеков и что не так.Единичный тест с WicketTester и CDI-Unit работает в 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) 
    ..... 

Любые ключи к тому, что я делаю неправильно?

ответ

1

Проблема была вызвана ошибкой в ​​cdi-unit версии 2.0.8. Брин решил проблему (см. https://github.com/BrynCooke/cdi-unit/issues/21), и поэтому она не должна появляться при использовании cdi-unit 2.0.9 или выше.

Смежные вопросы