2017-11-06 21 views
1

GoogleTest를 사용하여 프로젝트에서 단위 테스트를 만듭니다. 나는 다음과 같은 인터페이스를 구현하는 특정 개체를 조롱하려는 : Cock에서 모의 ​​전달하기

class IMockableObject 
{ 
public: 
    IMockable(); 
    IMockable(const IMockable &other); // copy constructor 
    virtual ~IMockable(); 
    virtual int DoSomething() = 0; 
    std::mutex UnCopyableMember; 
}; 

나는이 인터페이스를 상속이 개 클래스를 만들었습니다. 첫번째는 (그것이 CPP 파일 자체의 실행을 가짐) 실제 목적 :

class MockImplementation : public IMockable 
{ 
public: 
    MockImplementation(); 
    MockImplementation(const MockImplementation &other); 
    MOCK_METHOD0(DoSomething, int()); 
}; 

:

class MainImplementation : public IMockable 
{ 
public: 
    MainImplementation(); 
    MainImplementation(const MainImplementation &other); 
    virtual int DoSomething(); 
}; 

번째 하나가 거짓 (생성자의 구현은 CPP 파일에서) 인 내가 만들고있는 단위 테스트는 IMockable의 새 인스턴스를 만든 다음 DoSomething을 호출하는 메서드를 테스트하는 것입니다. 이 메소드를 호출하는 객체는 생성자에서 인수로 팩토리를 가져와 IMockable을 인스턴스화합니다.

ClassToTest.cpp : 공장 얻을해야하기 때문에 이전에 만든, 내가 시험을 통과 할 것으로 예상

TEST(FactoryTest, DoSomethingIsCalled) 
{ 
    MockImplementation mock; 
    EXPECT_CALL(mock, DoSomething()) 
     .Times(AtLeast(1)); 

    auto factory = [mock]() 
    { 
     return std::make_unique<MockImplementation>(mock); 
    }; 

    ClassToTest object(factory); 
    object.MethodToTest(); 
} 

:

이제 내 모든 개체가 정의되어 있는지
ClassToTest::ClassToTest(std::function<std::unique_ptr<IMockable>()> factory) 
{ 
    this->factory = factory; 
} 

void ClassToTest::MethodToTest() 
{ 
    std::unique_ptr<IMockable> object = this->factory(); 
    object->DoSomething(); 
    //... 
} 

, 여기에 테스트입니다 조롱하고 MethodToTest으로 전화하십시오. 그러나 테스트가 실패하고 난 구글 모의에서 다음과 같은 출력을 얻을 :

GMOCK 경고 : 비 관심 모의 함수 호출 - 반환 기본 값입니다. 함수 호출 : MethodToTest()

팩토리는 모의를 가져 오지만 어설 션을 무시합니다. 뭐가 문제 야?

TEST(FactoryTest, DoSomethingIsCalled) 
{ 
    auto factory = []() 
    { 
     auto mock = std::make_unique<MockImplementation>(); 
     EXPECT_CALL(*mock, DoSomething()).Times(AtLeast(1)); 
     return mock; 
    }; 

    ClassToTest object(factory); 
    object.MethodToTest(); 
} 

귀하의 방법은 조롱 객체의 복사본을하지,하지만 원래는 기대를 가지고

답변

3

당신은 할 수 있습니다. (기대는 복사/공유되지 않음).

+0

복사본은 어디에 추가됩니까? – oOnez

+1

복사본으로 복사 (첫 번째 복사본)하고 복사 생성자'std :: make_unique (모의)'(두 번째 복사본)에 의해'std :: unique_ptr'을 만듭니다. – Jarod42