2014-12-11 4 views
0

그 메서드를 전혀 호출 할 수없는 경우 최종 메서드에 대한 기대치를 설정하려면 어떻게해야합니까? PowerMock 조롱하는 호출을 보장하도록되어 있지만, 난 그 단계에 도달 할 수 없습니다Powermock/EasyMock : 예외를 던질 최종 메서드에 대한 기대 설정

WithFinal.java :

public class WithFinal { 
    public final void finalMethod() { 
     throw new RuntimeException(); 
    } 
} 

CallsFinal.java :

public class CallsFinal { 
    private WithFinal withFinal; 

    public CallsFinal(WithFinal withFinal) { 
     this.withFinal = withFinal; 
    } 

    public void callFinal() { 
     withFinal.finalMethod(); 
    } 
} 

PowerMockTest.java :

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

import static org.powermock.api.easymock.PowerMock.*; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(CallsFinal.class) 
public class PowerMockTest { 
    @Test public void testFinal() { 
     WithFinal mock = createMock(WithFinal.class); 
     CallsFinal callsFinal = new CallsFinal(mock); 
     mock.finalMethod(); 
     EasyMock.expectLastCall().atLeastOnce(); 
     replay(mock); 
     callsFinal.callFinal(); 
     verify(mock); 
    } 
} 

나는 어, mock.finalMethod()에 최초의 호출에 RuntimeException를 얻을 수 ich는 의미가 있지만, PowerMock의 모든 점이이를 가능하게하는 것이라고 생각했습니다.

답변

1

테스트 클래스에 실수가 있습니다. @PrepareForTest(CallsFinal.class) 대신 @PrepareForTest(WithFinal.class)이 있어야합니다.

PowerMock은 호출 클래스가 JRE에서 시스템 클래스 조롱을 테스트 할 때만 필요합니다. 그렇지 않으면 조롱받을 클래스가 준비되어야합니다.

마지막으로 여기에서 사용할 수있는 조롱 라이브러리가 있습니다. JMockit입니다. 그것으로, 시험은 다음과 같이 쓰여질 수 있습니다 :

import org.junit.*; 
import mockit.*; 

public class JMockitTest { 
    @Tested CallsFinal callsFinal; 
    @Injectable WithFinal mock; 

    @Test public void testFinal() { 
     new Expectations() {{ mock.finalMethod(); }}; 

     callsFinal.callFinal(); 
    } 
} 
0

PowerMock을 사용하면 직접 메서드 호출 대신 내부 메서드 호출을 건너 뛸 수 있습니다.

예를 들어 WithFinal 클래스의 finalMethod를 내부적으로 호출하는 CallsFinal 클래스의 callFinal 메소드를 테스트하려고합니다. 따라서이 경우 WithFinal 클래스를 인스턴스화하지 않으려면 withFinal 객체를 조롱하여 finalMethod에 대한 내부 호출을 건너 뛸 수 있어야합니다.

+0

'CallsFinal'은 테스트하려고하는 클래스입니다. 그래서'WithFinal'을 조롱하고'finalMethod' 호출을 모의하고 싶습니다. 그렇습니다, 요점입니다. – lmm

+1

'@PrepareForTest (WithFinal.class)'가 아니어야합니까? –

+0

@ Rogério 예, 그렇습니다! 대답으로 해두면 받아 들일 것입니다. – lmm