2010-07-02 5 views

답변

11

EasyMock에가 테스트 프레임 워크는 "인터페이스 (그리고 클래스 확장을 통해 객체)"당신이 클래스를 조롱 할 수 있도록없이 인터페이스. 정적 클래스에 대한 접근자를 사용하여 인터페이스 객체를 만든 다음 해당 객체를 모의 해보십시오.

EDIT : Btw, 정적 클래스를 수행하지 않는 것이 좋습니다. TDD를 수행하는 경우 모든 것이 인터페이스되도록하는 것이 좋습니다.

3

일반적으로 말해서, 일종의 접근자를 사용하지 않고 정적 메서드를 모의 할 수는 없으므로 정적 메서드 사용의 목적을 무력화시키는 것 같습니다. 상당히 실망 스러울 수 있습니다.

정적 방법을 모의하기 위해 일종의 사탄 매직 (Satanic Magic)을 사용하는 "TypeMock Isolator"라는 도구가 있지만 도구가 상당히 비쌉니다.

문제는 정적 메서드를 재정의 할 수 없다는 것입니다. 가상으로 선언 할 수는 없습니다. 인터페이스에 포함시킬 수 없습니다.

네거티브 넬리가되어 죄송합니다.

당신은 테스트 클래스에서 테스트 클래스의 인스턴스에서이 메소드를 오버라이드 (override), 방법에 정적 전화를 이동 테스트에서 로컬 인터페이스를 만들 수 있습니다 : 그냥 케이스 PowerMock에

9

은 어떤 이유로 사용할 수 없습니다 클래스와 오버라이드 (override) 방법의 방법을 사용하십시오

private interface IMocker 
{ 
    boolean doSomething(); 
} 

IMocker imocker = EasyMock.createMock(IMocker.class); 

... 

@Override 
void doSomething() 
{ 
    imocker.doSomething(); 
} 

... 

EasyMock.expect(imocker.doSomething()).andReturn(true); 
0

링크 된 exemple는 정적 모의을 보여주고 있기 때문에, EasyMock에/PowerMock 주사 클래스의 정기적 인 모의 따라 정적 모의를 구현하는 방법에 대한 exemple 추가.

PowerMockRunner과 함께 @Mock 서비스는 테스트 용 @TestSubject 서비스에 연결되어 있지 않습니다.

우리가 조롱 할 것이다 또 다른 서비스를 호출
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

@Service 
public class ServiceOne { 

    @Autowired 
    private ServiceTwo serviceTwo; 

    public String methodToTest() { 
     String returnServ2 = serviceTwo.methodToMock(); 
     return ServiceUtils.addPlus(returnServ2); 
    } 
} 

, ServiceTwo : 최종 클래스를 호출

import org.springframework.stereotype.Service; 

@Service 
public class ServiceTwo { 

    public String methodToMock() { 
     return "ServiceTwoReturn"; 
    } 
} 

그리고

하자 우리가 테스트 할 서비스, ServiceOne이 있다고 정적 메소드, ServiceUtils :

public final class ServiceUtils { 

    public static String addPlus(String pParam) { 
     return "+" + pParam; 
    } 
} 

ServiceOne.methodToTest()을 호출 할 때 우리는를 얻습니다.을 반환합니다.만 주입 ServiceTwo 봄 서비스 조롱 EasyMock에 함께


JUnit 테스트 :

import static org.easymock.EasyMock.expect; 
import static org.easymock.EasyMock.replay; 
import static org.easymock.EasyMock.verify; 
import static org.junit.Assert.assertEquals; 

import org.easymock.EasyMockRunner; 
import org.easymock.Mock; 
import org.easymock.TestSubject; 
import org.junit.Test; 
import org.junit.runner.RunWith; 

@RunWith(EasyMockRunner.class) 
public class ExempleTest { 

    @TestSubject 
    private ServiceOne serviceToTest = new ServiceOne(); 

    @Mock 
    private ServiceTwo serviceMocked; 

    @Test 
    public void testMethodToTest() { 
     String mockedReturn = "return2"; 

     expect(serviceMocked.methodToMock()).andReturn(mockedReturn); 
     replay(serviceMocked); 

     String result = serviceToTest.methodToTest(); 

     verify(serviceMocked); 

     assertEquals("+" + mockedReturn, result); 
    } 
} 

Junit와 테스트 EasyMock에 & PowerMock, 주입 ServiceTwo 봄 서비스 조롱 또한 마지막으로 클래스 및 정적 메서드 :

import static org.easymock.EasyMock.expect; 
import static org.junit.Assert.assertEquals; 
import static org.powermock.api.easymock.PowerMock.createMock; 
import static org.powermock.api.easymock.PowerMock.mockStatic; 
import static org.powermock.reflect.Whitebox.setInternalState; 

import org.easymock.Mock; 
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(ServiceUtils.class) 
public class ExempleTest { 

    private ServiceOne serviceToTest; 

    private ServiceTwo serviceMocked; 

    @Before 
    public void setUp() { 
     serviceToTest = new ServiceOne(); 
     serviceMocked = createMock(ServiceTwo.class); 
     // This will wire the serviced mocked into the service to test 
     setInternalState(serviceToTest, serviceMocked); 
     mockStatic(ServiceUtils.class); 
    } 

    @Test 
    public void testMethodToTest() { 
     String mockedReturn = "return2"; 
     String mockedStaticReturn = "returnStatic"; 

     expect(serviceMocked.methodToMock()).andReturn(mockedReturn); 
     expect(ServiceUtils.addPlus(mockedReturn)).andReturn(mockedStaticReturn); 
     PowerMock.replayAll(); 

     String result = serviceToTest.methodToTest(); 

     PowerMock.verifyAll(); 

     assertEquals(mockedStaticReturn, result); 
    } 
} 
관련 문제