我们有一个项目使用

  • Weld-SE 用于依赖注入(inject)
  • 调用本地库的静态本地方法

  • 在编写单元测试时,为了测试与 native 库交互的托管 bean,我们想模拟定义它们的类。但是, PowerMock (特别是注释 @PrepareForTest )似乎与 Weld 的初始化困惑。例如,如果我有以下内容:
    @RunWith(PowerMockRunner.class)
    @PrepareForTest(StaticNativeAPI.class)
    public class Test {
      @Before
      public void setup() {
        WeldContainer wc = new Weld().initialize();
      }
    }
    

    然后 Weld 将无法初始化并出现以下错误:


    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 进行了两次解析。有谁知道如何让这两个库一起玩得很好?

    最佳答案

    它似乎是一个 bug with the MockClassLoader

    我提交了一个补丁,所以它可能会在 1.5.5 版本中修复。

    关于java - 将 Powermock 与 Weld 混合使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21885178/

    10-12 00:38