Смешивание Powermock с Weld?

У нас есть проект, который использует

  • Weld-SE для внедрения зависимостей
  • статические нативные методы для вызова нативной библиотеки

При написании модульных тестов, чтобы протестировать управляемые компоненты, которые взаимодействуют с собственной библиотекой, мы хотели бы имитировать класс, в котором они определены. Однако PowerMock (в частности, аннотация @PrepareForTest), похоже, мешает инициализации Weld. Например, если у меня есть следующее:

@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticNativeAPI.class)
public class Test {
  @Before
  public void setup() {
    WeldContainer wc = new Weld().initialize();
  }
}

то Weld не сможет инициализироваться со следующей ошибкой:

org.jboss.weld.exceptions.DeploymentException: WELD-001423 Невозможно включить тот же альтернативный класс компонентов [com.mycompany.AltBean в jar:file:/C:/Users/Me/.m2/repository/com/mycompany/project/ версия-SNAPSHOT/версия-проекта-SNAPSHOT-tests.jar!/META-INF/beans.xml@8, com.mycompany.AltBean в jar:file:/C:/Users/Me/.m2/repository/com/ mycompany/project/version-SNAPSHOT/project-version-SNAPSHOT-tests.jar!/META-INF/beans.xml@8] в beans.xml

at org.jboss.weld.manager.Enabled.createMetadataMap(Enabled.java:123)
at org.jboss.weld.manager.Enabled.<init>(Enabled.java:94)
at org.jboss.weld.manager.Enabled.of(Enabled.java:79)
at org.jboss.weld.bootstrap.BeanDeployment.<init>(BeanDeployment.java:114)
at org.jboss.weld.bootstrap.WeldBootstrap$DeploymentVisitor.visit(WeldBootstrap.java:184)
at org.jboss.weld.bootstrap.WeldBootstrap$DeploymentVisitor.visit(WeldBootstrap.java:153)
at org.jboss.weld.bootstrap.WeldBootstrap.startContainer(WeldBootstrap.java:284)
at org.jboss.weld.bootstrap.api.helpers.ForwardingBootstrap.startContainer(ForwardingBootstrap.java:42)
at org.jboss.weld.environment.se.Weld.initialize(Weld.java:129)
at com.mycompany.Test.setup(Test.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.internal.runners.ClassRoadie.runBefores(ClassRoadie.java:56)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:43)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:104)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:234)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:133)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:114)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:188)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:166)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:86)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:101)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:74)

Другими словами, он дважды анализирует beans.xml. Кто-нибудь знает, как заставить эти две библиотеки хорошо играть вместе?


person Kricket    schedule 19.02.2014    source источник
comment
Вы пытались полагаться на неявную активацию CDI 1.1. Если вы не предоставите файл beans.xml, CDI активируется в режиме обнаружения компонентов annotated. Вы должны убедиться, что все ваши bean-компоненты аннотированы областью CDI (@ApplicationScoped или @Dependent) и использовать Weld 2.x для CDI 1.1.   -  person Antoine Sabot-Durand    schedule 19.02.2014
comment
К сожалению, пока мы застряли на Weld 1.9. Надо будет рассмотреть возможность обновления...   -  person Kricket    schedule 20.02.2014


Ответы (1)


Похоже, это ошибка с MockClassLoader.

Я отправил патч, так что он, вероятно, будет исправлен в версии 1.5.5.

person Kricket    schedule 20.02.2014