0

我正在使用带有 Easymock 扩展的 Powermock 1.4.9。

以下是我要测试的方法

Public class SomeClass {
    public String methodToTest(String id) throws Exception {
        try {
            ClassA ojbectA = MyFactory.staticMethod();
            String str = helperMethod(id);
            ojbectA.methodA(str);
            return objectA.methodB(str);
        }
        catch (Exception e) {
            throw e;
        }
    }
}

以下是我为测试上述方法而编写的测试类和测试。我同时使用 PowerMock 和 EasyMock,因为我有静态和私有方法调用。

import org.easymock.EasyMock;
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;

import static org.easymock.EasyMock.isA;
import static org.powermock.api.easymock.PowerMock.mockStatic;

@RunWith(PowerMockRunner.class)
@PrepareForTest{{SomeClass.class,MyFactory.class, ClassA.class}}
public class TestClass {
@Test
public void testMethod1() {
    try {
        ClassA mockA = PowerMock.createMock(ClassA.class);
        mockStatic(MyFactory.class);
        SomeClass someObj = PowerMock.createPartialMock(SomeClass.class,"helperMethod");

        String mockLog = "This is sample";
        String mockId = "mockId";
        String woMockId = "WO_mockId";

        //Mock all static methods
        EasyMock.expect(MyFactory.staticMethod()).andReturn(mockA);

        //Partial mocking
        PowerMock.expectPrivate(someObj,"helperMethod",mockId).andReturn(woMockId);

        //Mock methodA(String) method
        mockA.methodA(EasyMock.isA(String.class));
        PowerMock.expectLastCall().times(0, 1);

        //When methodB(String) is called, intercept it and return a standard value.
        EasyMock.expect(mockA.methodB(isA(String.class))).andReturn(mockLog);

        EasyMock.replay(mockA);
        EasyMock.replay(someObj);
        PowerMock.replay(MyFactory.class);

        String obtainedResult = someObj.getWorkorderLogByWoId(mockId);

        assertEquals(obtainedResult,mockLog);


        EasyMock.verify(mockA);
        EasyMock.verify(someObj);
        PowerMock.verify(MyFactory.class);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}
}

这在 Intellij IDEA 和 Eclipse 上运行良好,没有任何异常。但是,当我使用 ANT 在命令行运行此测试时,我得到以下异常。

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 com.xyz.ems.server.services.workorder.TestClass.testMethod1(TestClass.java:<some_line_number>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:518)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1052)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:906)

有一个不替换字符串的原始代码请求。所以下面是代码。

import com.xyz.ems.common.UnitTestCase;
import com.xyz.ems.server.services.logmessage.LogMessageManager;
import com.xyz.ems.server.services.workorder.database.WorkOrderManager;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import static org.powermock.api.easymock.PowerMock.createMock;
import static org.powermock.api.easymock.PowerMock.createPartialMock;
import static org.powermock.api.easymock.PowerMock.expectLastCall;
import static org.powermock.api.easymock.PowerMock.expectPrivate;
import static org.powermock.api.easymock.PowerMock.mockStatic;
import static org.powermock.api.easymock.PowerMock.replay;
import static org.powermock.api.easymock.PowerMock.verify;

@RunWith(PowerMockRunner.class)
@PrepareForTest({WorkOrderManager.class,WorkOrderFactory.class,     LogMessageManager.class})
public class WorkOrderManagerPM_JTest extends UnitTestCase {


public WorkOrderManagerPM_JTest(String name) {
    super(name);
}

@Before
public void firstMethod() {
    assertTrue(true);
}

@After
public void lastMethod() {
    assertTrue(true);
}

@Test
public void testGetWoLogByObjectId() {
    try {
        LogMessageManager logMsgMgrMock = createMock(LogMessageManager.class);
        mockStatic(WorkOrderFactory.class);
        WorkOrderManager wMgr = createPartialMock(WorkOrderManager.class,"buildWorkOrderIdString");

        String mockLog = "This is sample";
        String mockId = "mockId";
        String woMockId = "WO_mockId";

        //Mock all static methods
        expect(WorkOrderFactory.getLogMessageManager()).andReturn(logMsgMgrMock);

        //Partial mocking
        expectPrivate(wMgr,"buildWorkOrderIdString",mockId).andReturn(woMockId);

        //Mock openLogMessageDoc() method
        logMsgMgrMock.openLogMessageDoc(isA(String.class));
        expectLastCall().times(0, 1);

        //When getAllLogMessageAsString() is called, intercept it and return a standard value.
        expect(logMsgMgrMock.getAllLogMessagesAsString(isA(String.class))).andReturn(mockLog);

        replay(logMsgMgrMock);
        replay(wMgr);
        replay(WorkOrderFactory.class);

        String obtainedResult = wMgr.getWorkorderLogByWoId(mockId);

        assertEquals("getWorkorderLogByWoId() general case passed",obtainedResult,mockLog);


        verify(logMsgMgrMock);
        verify(wMgr);
        verify(WorkOrderFactory.class);
    }
    catch (Exception e) {
        e.printStackTrace();
        fail("Failed to test getWorkorderLogById()");
    }
}

以及正在测试的原始方法...

public class WorkOrderManager {
public String getWorkorderLogByWoId(String woId) throws WorkOrderServiceEMSException {
    try {
        LogMessageManager logMsgMgr = WorkOrderFactory.getLogMessageManager();
        String workOrderLogId = buildWorkOrderIdString(woId);
        logMsgMgr.openLogMessageDoc(workOrderLogId);
        return logMsgMgr.getAllLogMessagesAsString(workOrderLogId);
    }
    catch (Exception e) {
        String msg = "Failed to get Work Order Log for workorder Id : " + woId;
        throw new WorkOrderServiceEMSException(msg, WorkOrderServiceEMSError.WO_GET_WOLOG_BY_OBJECTID.newInstanceWithFormatArgs(woId), e);
    }
}
}
4

1 回答 1

0

尝试这个....

package com.chumma.pdf.main;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest( { SomeClass.class, MyFactory.class, ClassA.class })
public class SomeClassTest {
    SomeClass someClass;

    @Mock
    ClassA mockClassA;

    @Before
    public void inti() {
        someClass = PowerMockito.spy(new SomeClass());
    }

    @Test
    public void test() throws Exception {
        // To mock MyFactory.staticMethod();
        PowerMockito.mockStatic(MyFactory.class);
        Mockito.when(MyFactory.staticMethod()).thenReturn(mockClassA);
        // To mock helperMethod(id);
        PowerMockito.when(someClass, "helperMethod", Mockito.anyString())
                .thenReturn("retrunString");
        // To mock ojbectA.methodA(str);
        Mockito.when(mockClassA.methodA(Mockito.anyString())).thenReturn(
                "retStr1");
        // To mock ojbectA.methodB(str);
        Mockito.when(mockClassA.methodB(Mockito.anyString())).thenReturn(
                "retStr2");
    }
}
于 2012-06-01T11:06:34.300 回答