2011-04-07 5 views
5

나는 Boost 함수를 사용하는 생성자를 가진 클래스가 있는데, 나는 이것을 Google Mock으로 테스트하려고한다. 다음 코드 샘플 클래스와 테스트 내 시도를 보여줍니다boost :: bind와 함께 Google Mock 사용하기

에서 MyClass.h :

#include <boost/function.hpp> 
class MyClass 
{ 
public: 
    MyClass(boost::function<void()> callback); 
    void callCallback(); 
private: 
    boost::function<void()> m_callback; 
}; 

MyClassTest.cpp : 비주얼 스튜디오 2008에서 MyClassTest.cpp를 컴파일하려고

#include <gtest/gtest.h> 
#include <gmock/gmock.h> 
#include <boost/bind.hpp> 
#include "MyClass.h" 
class CallbackMock 
{ 
public: 
    MOCK_METHOD0(callback, void()); 
}; 

TEST(MyClassShould, CallItsCallback) 
{ 
    CallbackMock callbackMock; 
    MyClass myClass(boost::bind(&CallbackMock::callback, callbackMock)); 
    EXPECT_CALL(callbackMock, callback()).Times(1); 
    myClass.callCallback(); 
} 

...gmock/gmock-generated-function-mockers.h(76) : error C2248: 'testing::internal::FunctionMockerBase::FunctionMockerBase' : cannot access private member declared in class 'testing::internal::FunctionMockerBase' 1> with 1> [ 1>
F=void (void) 1> ] 1>
.../gmock-spec-builders.h(1656) : see declaration of 'testing::internal::FunctionMockerBase::FunctionMockerBase' 1> with 1> [ 1>
F=void (void) 1> ] 1>
This diagnostic occurred in the compiler generated function 'testing::internal::FunctionMocker::FunctionMocker(const testing::internal::FunctionMocker &)' 1> with 1> [ 1>
Function=void (void) 1> ]

오류 선 함유 야유 유래 다음 오류를 범 t :: 바인드. 조롱 된 메소드를 void callback() {}로 바꾸면 컴파일 오류가 제거되지만 (Google Mock을 사용하지 않아도 됨) 목적을 무효화합니다. 테스트 한 클래스를 수정하지 않고 가능한 일을하려고합니까?

답변

5

나는이 줄 잘못된 생각 :

MyClass myClass(boost::bind(&CallbackMock::callback, callbackMock));

마지막 매개 변수는 이유는 구글 모의 모의 객체가 복사 가능한 아니라는 것이다 &callbackMock

+0

감사합니다. Ben, 고쳐 주셨습니다. –

16

해야합니다 -이 디자인입니다. 값으로 boost::bind에 전달하려고하면 컴파일러에서 복사 생성자를 생성하지 못합니다. 모의의 주소를 bind에 넣을 때 :

MyClass myClass(boost::bind(&CallbackMock::callback, &callbackMock)); 
+0

추가 설명을 주셔서 감사합니다. –

+2

이것은 실제로 허용 된 대답이어야합니다. 당신은 방금 저에게 많은 시간을 절약했습니다 !!! Vlad에게 감사드립니다! –