2016-10-11 8 views
1

추상 클래스를 모의하려고하는데 GMock 헤더 내부에서 오류를 계속 컴파일합니다. 나는 실제 코드를 공유 할 수 없지만 거의 같은 코드이다. 조롱은 잘 동작했지만, "DoStuff"함수를 변경하여 객체를 가져와 참조해야했습니다. 그 이후로는 컴파일되지 않습니다. 오류는 다음과 같습니다. * GMock은 "Element"를 long long *과 비교할 수 없습니다.GMock이 컴파일되지 않습니다. 사용자 유형 참조 인수가있는 가상 함수

"C++ code" 

using ::testing::NiceMock; 

class Element{}; 

class Foo 
{ 
    public: 
     virtual void DoStuff(Element&) = 0; 
}; 

class MockFoo : public Foo 
{ 
    public: 
     MockFoo() {}; 
     MOCK_METHOD1(DoStuff, void(Element&)); 

}; 

TEST(example, test) 
{ 
    NiceMock<MockFoo> mf; 
    Element element{}; 
    EXPECT_CALL(mf, DoStuff(element)).Times(1); 

    mf.DoStuff(element); 
} 

답변

1

generic comparisons matchers을 살펴보십시오.

당신이 당신의 조롱 개체에 정확히 같은 요소가 mf.DoStuff를 통해 전달되어 있는지 확인하려면

- ::testing::Ref 정규 표현을 사용

EXPECT_CALL(mf, DoStuff(Ref(element))); 

(참고 : 시간 (1) 기본입니다 - 그래서 정말 필요가 없습니다).

당신은 전달 된 객체가 정확히 동일한 값이 있는지 확인하고자하는 경우 - ::testing::Property처럼 - - 일부 적절한 정규 또는 사용 - 그것을 비교 연산자를 정의 같은 :

EXPECT_CALL(mf, DoStuff(AllOf(Property(&Example::getX, expectedXValue), 
           Property(&Example::getY, expectedYValue)))); 

내가 정확한 문제가 당신을하기 때문에 추측을 실제 Example 클래스는 추상 클래스이거나 operator == 클래스가 아니기 때문에 기본 일치 자 ::testing::Eq을 사용할 수 없습니다.

+0

답장을 보내 주셔서 감사합니다. 정확한 "요소"가 필요하지 않습니다. 함수가 호출되는지 테스트해야합니다. 그러나 다시 한 번 고마워, 나는 너의 제안을 시도 할 것이다. –

+1

'testing :: _'어떤 정규 표현식이라도 사용할 수 있다면'EXPECT_CALL (mf, DoStuff (_)); '이 필요합니다. – PiotrNycz

+0

감사합니다. –