2014-02-19 3 views
4

У нас есть проект, который используетСмешивание 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 Cannot enable the same alternative bean class [com.mycompany.AltBean in jar:file:/C:/Users/Me/.m2/repository/com/mycompany/project/version-SNAPSHOT/project-version-SNAPSHOT-tests.jar!/META-INF/[email protected], com.mycompany.AltBean in jar:file:/C:/Users/Me/.m2/repository/com/mycompany/project/version-SNAPSHOT/project-version-SNAPSHOT-tests.jar!/META-INF/[email protected]] in 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 дважды. Кто-нибудь знает, как заставить эти две библиотеки хорошо играть вместе?

+0

Вы пытались полагаться на неявную активацию CDI 1.1. Если вы не предоставляете beans.xml, CDI активируется с помощью режима «annotated» bean-discovery. Вы должны быть уверены, что все ваши bean-аннотированные с CDI-областью (@ApplicationScoped или @Dependent) и используйте Weld 2.x, чтобы быть на CDI 1.1. –

+0

К сожалению, пока мы застряли с использованием Weld 1.9. Мне нужно будет изучить возможность обновления ... – Kricket

ответ

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