2017-11-29 7 views
0

나는 클래스가 같은 아래에 언급 한 말을 가지고모의 방법

class A 
{ 
void show() 
{} 
int data(int x) 
{} 
..... 
}; 

내가 클래스를 조롱 할 필요가 - 멤버 함수가 가상하지 않기 때문에 - 나는 아래에 언급처럼 내 모의 클래스를 디자인 할 수 있습니다 :

class MockA : public A 
{ 
MOCK_METHIOD0(show, void()); 
MOCK_METHIOD1(data, int (int)); 
} 

나는이 방법을 구현할 수 있으며, 의 클래스 A의 기능을 조롱을 놓치지 MockA에서 기회가? MockA를 사용하여 생성 된 객체는 어쨌든 클래스 A 실제 메소드 구현을 호출합니다.

답변

0

일반적으로 모의 객체는 A에서 상속받지 않으며, 대신 컴파일 타임 메커니즘을 사용하여 구현 클래스 또는 모의 클래스를 사용할 것인지 여부를 선택합니다. 예 : A을 사용하는 모든 것을 템플릿화한 다음 템플릿을 A 또는 MockA으로 인스턴스화하여 테스트 설정에서 모의 ​​클래스로 프로덕션 클래스를 대체합니다. mock에서 구현되지 않았지만 호출되는 모든 메소드는 컴파일 시간 오류를 발생시킵니다. 모의 정의에서 매크로의 사용은 메소드가 가상이 아니더라도 거의 동일합니다.

어려운 부분이 클래스를 대체하고 있습니다. 템플릿을 사용하거나 매크로를 통해 클래스 이름을 참조하거나 동일한 클래스 이름을 사용하고 하나만 링크되도록 할 수 있습니다.

+0

그러나 MockA로 개체를 만들면 위의 메서드가 실제 구현을 재정의하지 않을까요? – Prakash

+0

"실제 구현을 재정의"한다는 것이 확실하지 않습니다. 비 - 가상 메소드는 이름으로 링크되므로, 컴파일러는 예를 들어, 'A :: show' 또는'MockA :: show' 중 하나입니다. 가상 메소드의 경우조차도 모의 객체는 일반적으로 구현 객체로부터 상속받지 않지만, 구현 객체도 상속받는 인터페이스에서 가져온다. –