【问题标题】:EasyMock/PowerMock - Mocking Static Methods Throws Error: no last call on a mock availableEasyMock/PowerMock - 模拟静态方法抛出错误:没有可用的模拟的最后一次调用
【发布时间】:2019-06-24 10:32:40
【问题描述】:

我正在编写一个简单的 Java 类来测试 EasyMock/PowerMock 功能以模拟类中的静态方法。

所以我只是模拟 Math.random 方法以返回 constant 值用于测试目的。

这是我的代码:

package x.y.z;

import org.easymock.EasyMock;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;



@RunWith(PowerMockRunner.class)
@PrepareForTest(Math.class)
public class PowerMockStaticTestExample {

    @BeforeClass
    public static void setupBeforeClass() {
        try {
            PowerMock.mockStatic(Math.class);
            EasyMock.expect(Math.random()).andReturn(0.50).anyTimes();
            PowerMock.replay(Math.class);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

    @Test
    public void dummyTest()
    {
        System.out.println("DummyTest Called!");
        assert true==true;
    }

    @Test
    public void testMath()
    {
        System.out.println("Math Test Start "+Math.random());
        assert true==true;

    }


 }

依赖关系:

我正在使用:easyMock: org.easymock:easymock:3.1

powerMockEasyMockFull: org.powermock:powermock-easymock-release-full:1.5.1

java 1.7.0_80.

但每次我尝试使用testng 运行这个测试类;它抛出以下异常:

java.lang.IllegalStateException: no last call on a mock available
        at org.easymock.EasyMock.getControlForLastCall(EasyMock.java:520)
        at org.easymock.EasyMock.expect(EasyMock.java:498)
        at x.y.z.PowerMockStaticTestExample.setupBeforeClass(PowerMockStaticTestExample.java:40)
        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.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
        at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
        at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
        at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138)
        at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:175)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:107)
        at org.testng.TestRunner.privateRun(TestRunner.java:767)
        at org.testng.TestRunner.run(TestRunner.java:617)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)

在浏览了很多关于 SO 和 Google 的帖子之后;终于想到在这里问这个问题了。

希望这里的专家能帮助我。提前致谢!

【问题讨论】:

    标签: java gradle static powermock easymock


    【解决方案1】:

    您似乎在使用 TestNG(查看导入)。但使用的跑步者是 JUnit 跑步者。

    那么,PowerMock 不适用于BeforeClass。您需要使用Before。这是一个工作示例。

    import org.easymock.EasyMock;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.powermock.api.easymock.PowerMock;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;
    
    @RunWith(PowerMockRunner.class)
    @PrepareForTest(Math.class)
    public class PowerMockStaticTestExample {
    
        @Before
        public void setupBeforeClass() {
            PowerMock.mockStatic(Math.class);
            EasyMock.expect(Math.random()).andReturn(0.50).anyTimes();
            PowerMock.replay(Math.class);
        }
    
        @Test
        public void dummyTest() {
            System.out.println("DummyTest Called!");
        }
    
        @Test
        public void testMath() {
            System.out.println("Math Test Start "+Math.random());
        }
    }
    

    【讨论】:

    • 感谢您的帮助。愚蠢的 IDE 导入导致了这个问题。我昨天已经和testng 一起工作了。不过感谢您的时间:)!
    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多