java.lang.NoSuchMethodError powermock

java.lang.NoSuchMethodError powermock,java,junit,easymock,powermock,jmock,Java,Junit,Easymock,Powermock,Jmock,伙计们 问题: 如何模拟定义了其他静态最终类的静态最终类 问题描述: 当我想为最终类ApplianceRelationshipUtils.java编写一些单元测试用例时,在这个最终类ApplianceRelationshipUtils.java中,总是包含另一个静态类ApplianceUtilities.java。因此,我需要使用powermock模拟静态类ApplianceUtilities.java,如下所示: // mock the class for one method onl

伙计们 问题: 如何模拟定义了其他静态最终类的静态最终类

问题描述: 当我想为最终类ApplianceRelationshipUtils.java编写一些单元测试用例时,在这个最终类ApplianceRelationshipUtils.java中,总是包含另一个静态类ApplianceUtilities.java。因此,我需要使用powermock模拟静态类ApplianceUtilities.java,如下所示:

    // mock the class for one method only
    PowerMock.mockStaticPartialNice(ApplianceUtilities.class,"getApplianceVersion");
但是在ApplianceUtilities.java中定义了许多静态最终类,如下所示:

private static final IMesUtils m_mesUtils = new MesUtils();
private static final IEndpointUtilities m_endpointUtils = new DefaultEndpointUtilities(m_mesUtils);
private static final ICasUtilities m_casUtils = new  DefaultCasUtilities(m_endpointUtils);
private static final IHAApplianceUtilities m_haUtils = new HAApplianceUtils(m_endpointUtils, m_casUtils);
因此,当我运行testcase时,会抛出一些异常,如下所示:

java.lang.NoSuchMethodError: com.ibm.usmi.services.updates.util.RestartUtilities.<init>(Lcom/ibm/usmi/services/updates/util/IRcsUtilities;Lcom/ibm/usmi/services/updates/util/MesUtils;Lcom/ibm/usmi/services/updates/util/IUpdateUtils;)V
at com.ibm.vmi.updates.appliance.util.HAApplianceUtils.<init>(HAApplianceUtils.java:222)
at com.ibm.vmi.updates.appliance.util.ApplianceUtilities.<clinit>(ApplianceUtilities.java:89)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.sf.cglib.proxy.Enhancer.setCallbacksHelper(Enhancer.java:616)
at net.sf.cglib.proxy.Enhancer.setThreadCallbacks(Enhancer.java:609)
at net.sf.cglib.proxy.Enhancer.registerCallbacks(Enhancer.java:578)
at org.easymock.internal.ClassProxyFactory.createProxy(ClassProxyFactory.java:194)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:60)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:98)
at org.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2214)
at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2163)
at org.powermock.api.easymock.PowerMock.createMock(PowerMock.java:76)
at org.powermock.api.easymock.PowerMock.createPartialMock(PowerMock.java:762)
at com.ibm.vmi.updates.appliance.relationship.ApplianceRelationshipUtilsTest.test_validateApplianceReqs(ApplianceRelationshipUtilsTest.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:312)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:296)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:112)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:73)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:284)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:209)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:148)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:122)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:42)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
java.lang.NoSuchMethodError:com.ibm.usmi.services.updates.util.RestartUtilities.(Lcom/ibm/usmi/services/updates/util/IRcsUtilities;Lcom/ibm/usmi/services/updates/util/MesUtils;Lcom/ibm/usmi/services/updates/util/IUpdateUtils;)V
位于com.ibm.vmi.updates.appliance.util.HAApplianceUtils。(HAApplianceUtils.java:222)
位于com.ibm.vmi.updates.appliance.util.ApplianceUtilities(ApplianceUtilities.java:89)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于net.sf.cglib.proxy.Enhancer.setCallbackHelper(Enhancer.java:616)
位于net.sf.cglib.proxy.Enhancer.setThreadCallbacks(Enhancer.java:609)
位于net.sf.cglib.proxy.Enhancer.registerCallbacks(Enhancer.java:578)
位于org.easymock.internal.ClassProxyFactory.createProxy(ClassProxyFactory.java:194)
位于org.easymock.internal.MocksControl.createMock(MocksControl.java:60)
位于org.easymock.internal.MocksControl.createMock(MocksControl.java:98)
位于org.powermock.api.easymock.powermock.doCreateMock(powermock.java:2214)
位于org.powermock.api.easymock.powermock.doMock(powermock.java:2163)
位于org.powermock.api.easymock.powermock.createMock(powermock.java:76)
位于org.powermock.api.easymock.powermock.createPartialMock(powermock.java:762)
在com.ibm.vmi.updates.appliance.relationship.ApplianceRelationshipUtilTest.test_ValidateApplianceQS(ApplianceRelationshipUtilTest.java:77)上
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:312)
位于org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86)
位于org.junit.internal.runners.MethodRoadie.runbeforesthentestthenuter(MethodRoadie.java:94)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:296)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:112)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:73)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runbeforesthenTesttheAfter(PowerMockJUnit44RunnerDelegateImpl.java:284)
位于org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
位于org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.invokeTestMethod(powermockjunit44runnerdelegateinpl.java:209)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.runMethods(powermockjunit44runnerdelegateinpl.java:148)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl$1.run(powermockjunit44runnerdelegateinpl.java:122)
位于org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
位于org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.run(powermockjunit44runnerdelegateinpl.java:120)
位于org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102)
位于org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
位于org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:42)
位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

您可以尝试一下@SuppressStaticInitialization,看看这是否有帮助。

这似乎是Mockito和PowerMock之间的兼容性问题,因此我在这里留下了一个解决方案,以防其他人遇到相同的错误:

JUnit

JUnit 4.4或更高版本如果需要,请在pom.xml中添加以下内容 使用JUnit 4.4或更高版本:

   <properties>
     <powermock.version>1.7.1</powermock.version> 
   </properties>
   <dependencies>
    <dependency>
     <groupId>org.powermock</groupId>
     <artifactId>powermock-module-junit4</artifactId>
     <version>${powermock.version}</version>
     <scope>test</scope>    
    </dependency>    
    <dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>${powermock.version}</version>
    <scope>test</scope>    
   </dependency>

1.7.1 
org.powermock

我可以确认这些错误来自Mockito和PowerMock之间的版本不匹配。我们应该只在父模块
pom.xml
文件中定义依赖项版本,并在子模块
pom.xml
文件中引用它们

我在这里提供一个例子。提供的子
pom.xml
文件

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>${mockito.version}</version>
</dependency>

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4</artifactId>
  <version>${powermock.version}</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-api-mockito2</artifactId>
  <version>${powermock.version}</version>
  <scope>test</scope>
</dependency>
哪一包
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>${mockito.version}</version>
</dependency>

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4</artifactId>
  <version>${powermock.version}</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-api-mockito2</artifactId>
  <version>${powermock.version}</version>
  <scope>test</scope>
</dependency>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

   ...........................................................

  <properties>
    <powermock.version>1.7.4</powermock.version>
    <powermock-api.version>2.0.2</powermock-api.version>
    <mockito.version>2.8.9</mockito.version>
  </properties>

  .............................

</project>