PowerMock :: [java.lang.IllegalStateException:没有最后一次调用可用的模拟]

Sac*_*chG 2 java junit unit-testing easymock powermock

模拟静态方法powermock在expect()时给出异常.

@Test
public void testRegistrarService()
{
   mockStatic(IdGenerator.class);
   expect(IdGenerator.generateNewId()).andReturn(42L);
   long actualId=serTestObj.registerService();
   replay(IdGenerator.class);
   verify(IdGenerator.class);
   assertEquals(42L,actualId);
 }


public class ServiceRegistrator
{
public long registerService()
{
    long id = IdGenerator.generateNewId();
    return id;
 }
}

public class IdGenerator
{
  public static long generateNewId()
  {
    return System.currentTimeMillis();
  }
}
Run Code Online (Sandbox Code Playgroud)

例外情况是:

java.lang.IllegalStateException: no last call on a mock available
at org.easymock.EasyMock.getControlForLastCall(EasyMock.java:521)
at org.easymock.EasyMock.expect(EasyMock.java:499)
at  home.powermock.testServiceRegistrator.testRegistrarService(testServiceRegistrator.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at com.intellij.rt.execution.junit2.JUnitStarter.main(JUnitStarter.java:31)
Run Code Online (Sandbox Code Playgroud)

如何模拟staic方法,而m使用powerMock我正在使用intelliJ的想法,如何解决该异常.

Jos*_*seK 6

您的代码缺少注释

@PrepareForTest(IdGenerator.class)
Run Code Online (Sandbox Code Playgroud)


小智 5

就我而言,我在测试类中缺少以下方法

   @ObjectFactory
   /**
    * Configure TestNG to use the PowerMock object factory.
    */
   public IObjectFactory getObjectFactory() {
      return new org.powermock.modules.testng.PowerMockObjectFactory();
   }
Run Code Online (Sandbox Code Playgroud)

添加它后,我就摆脱了“没有对可用模拟的最后调用”错误。