2017-10-05 2 views
1

로컬 객체에서 해당 클래스의 메소드를 호출하기 위해 인스턴스화되는 시나리오가 있습니다. 즉 setSessionId()입니다.googlemock을 사용하여 집계 객체가 호출하는 모의 함수

int Cli::setSessionId() 
{ 
    SessionHandler oHandleSession; 
    return oHandleSession.getSessionId(sSessionId); 
} 

지금 SessionHandler의 모의 기능을 위해 내가 사용한 매크로를이 클래스는 추상적이고 기능이 아니므로이 경우 getSessionId()에, 내가 조롱하고자하는 기능을하기 전에 virtual 키워드를 추가하기 위해 다음과 같이 setSessionId의 해상력은 가상 순수하지 않다. (나는 하이 퍼포 레이션 의존성 삽입 (Dependency Injection)에 대해 알고 있지만,이 단계에서 거기에 가고 싶지 않는)

이 된 경우가 있었다이

int Cli::setSessionId(SessionHandler* oHandleSession) 
{ 
    ... 
    return oHandleSession->getSessionId(sSessionId); 
} 

그냥 파에 간단했을 것이다 모형 객체를 함수 setSessionid()에 결합 시켰지만 집계가 사용 되었기 때문에이 함수를 어떻게 모방 할 수 있습니까? getSessionId()?

답변

1

정적 다형성을 사용하거나 링크 타임 대체를 사용할 수 있습니다. 정적 다형성에 대한

당신은 같은 것을 할 :

class DefaultSessionHandler { 
    // methods implemented as you do now 
}; 

template <typename T> 
class SessionHandlerT { 
    // methods implemented in terms of delegation to methods on T 
}; 

using SessionHandler = SessionHandlerT<DefaultSessionHandler>; 

이 조금 번거로울 수 있습니다 및 추가 컴파일 시간을 도입 할 수 있으며이 작업을 할 수 있지만, 내가의 팬의 대부분은 아니에요 이 접근 방식은 이전에 여러 번 해봤지만

링크 타임 대체를 사용하면 SessionHandler 대체 구현을 제공하고 링크 시간에 상황을 해결할 수 있습니다. 즉, 동일한 이름을 가지고 있더라도 다른 것을 수행하는 SessionHandler 클래스의 다른 구현이 있음을 의미합니다. 다시 말하지만, 이것은 성 가시지만 일할 수 있습니다.

두 가지 방법 모두 고유 한 일련의 문제와 고통을 가지고 있습니다. 더 나은 단위 테스트 방법은 단순히 SUT 리팩터링을 통해 종속성 주입을 사용하는 것입니다.

또 다른 접근법은 단위 테스트를 포기하고 통합 테스트 만 수행하는 것입니다. 이것은 또한 자체적 인 문제를 가지고 있습니다.