2012-05-31 5 views
0

Easymock 확장 기능이있는 Powermock 1.4.9를 사용하고 있습니다. EasyMock PowerMock Ant 및 IDE가 아닌 IllegalStateException

다음

내가 테스트 클래스와 내가 위의 방법을 테스트하기 위해 작성한 테스트됩니다 다음

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); 
    } 
} 
} 
+0

은 수입 import 문 내 코드를 업데이트 – Thihara

+0

게시 할 수 있습니다. 감사. – maverick

+0

원래 코드 – maverick

답변

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"); 
    } 
} 
+0

으로 내 코드 스 니펫을 업데이트했습니다. easymock 확장자 인 powermock 인 powermock-easymock-1.4.9-full.jar를 사용하고 있습니다. import 문에서 mockito 확장자를 가진 powermock을 사용하는 것을 볼 수 있습니다. 나는 easymock estension을 가진 powermock만을 사용하도록 제한되어있다. 내 잘못이야, 내가 앞에서 언급 했어야 했어. 가장 귀찮은 것은 IDE에서 작동하지만 ANT에서는 작동하지 않는다는 것입니다. 이것이 왜 일어날 수 있는지에 대한 단서가 있습니까? 호기심을 위해 나는 당신의 솔루션을 시도하고 그것이 작동하는지 확인합니다. – maverick

+0

실제 소스 코드를 게시하면 도움이 될 것입니다. 테스트 클래스의 이름을 TestClass로 변경 한 것 같습니다. 실제 클래스와 로그를 제공하면 도움이 될 것입니다. ... – om39a

+0

@ om39a : 실제 코드를 게시했습니다. 뭔가 명확하지 않으면 알려주십시오. – maverick