簡體   English   中英

EasyMock / PowerMock-模擬靜態方法將引發錯誤:沒有對模擬的最后一次調用

[英]EasyMock/PowerMock - Mocking Static Methods Throws Error: no last call on a mock available

我正在編寫一個簡單的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運行這個測試類的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上瀏覽了很多帖子之后; 我終於想到在這里問這個問題。

希望這里的專家能幫助我。 提前致謝!

您似乎正在使用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());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM