2012-05-25 2 views
3

는(), 내가 부분적으로 모의 helperMethodPublic() 원하는 내 클래스 위의 클래스에 따라서PowerMock을 사용하여 공용 메서드를 부분 모의 해킹하는 방법은 무엇입니까? 다음

public class SomeClass { 
    public ReturnType1 testThisMethod(Type1 param1, Type2 param2) { 
     //some code 
     helperMethodPublic(param1,param2); 
     //more code follows 
    } 

    public ReturnType2 helperMethodPublic(Type1 param1, Type2 param2) { 
     //some code    
    } 
} 

testThisMethod을 테스트하는 동안입니다.

는 지금, 나는 다음을 수행 오전 : 컴파일러는 불평하지 않습니다

SomeClass someClassMock = 
    PowerMock.createPartialMock(SomeClass.class,"helperMethodPublic"); 
PowerMock.expectPrivate(someClassMock, "helperMethodPublic, param1, param2). 
    andReturn(returnObject); 

. 그래서 나는 내 테스트를 실행하려고하고 코드가 helperMethodPublic() 메소드를 쳤을 때 컨트롤은 메소드에 들어가서 거기에있는 코드의 각 라인을 실행하기 시작한다. 어떻게 이런 일이 일어나지 않도록합니까?

답변

8

모의 프레임 워크에 의존하지 않는 또 다른 해결책은 테스트에 정의 된 익명의 하위 클래스에서 'helperMethodPublic'을 무시하는 것입니다 : 당신이 당신의 시험에서이 인스턴스를 사용할 때

SomeClass sc = new SomeClass() { 
    @Override 
    public ReturnType2 helperMethodPublic(Type1 p1, Type2 p2) { 
     return returnObject; 
    } 
}; 

그 다음이 실행됩니다 'testThisMethod'의 원본 버전과 'helperMethodPublic'의 재정의 버전

+0

예이 작동하고 난 현재로서는이 일을하고있다 : 다른 모든 조롱 방법으로 기대를 설정 -

이보십시오. 그러나, 나는 개인 도우미 메서드의 일부 조롱을 이미 프레임 워크를 사용하고 있기 때문에 부분적으로 공용 도우미 메서드를 조롱하는 방법이 있어야합니다? – maverick

+0

감사합니다. 비슷한 문제에 대한 완벽한 해결책이었습니다. 나는이 화려한 테크닉을 결코 가질 수 없을 것이다! –

1

"helperMethodPublic"이 개인 메서드 (예 : PowerMock.expectPrivate)가 아니기 때문에 이러한 현상이 발생할 수 있습니다. PowerMock은 다른 조롱 프레임 워크를 확장하여 개인 및 정적 메서드를 조롱하는 등의 작업을 추가하는 프레임 워크입니다 (JMock, Mockito 등은 처리하지 않음). 공개 메소드의 일부 모의 작업을 수행하는 것은 기본 모의 프레임 워크에서 처리해야합니다.

4

제프가 말한 것 때문이라고 생각합니다.

SomeClass someClassMock = PowerMock.createPartialMock(SomeClass.class, 
                 "helperMethodPublic"); 

EasyMock.expect(someClassMock.helperMethodPublic(param1, param2)). 
    andReturn(returnObject); 

PowerMock.replayAll();