2017-09-13 130 views
-1

我一直在試圖使用GoogleMock重寫底層類中的幾個特定方法,但是我似乎正在獲取基礎構造函數,而不是模擬對象。有什麼明顯的我在這裏失蹤?爲什麼GoogleMock嘲笑的原始方法仍然被調用?

我一直在關注下面的例子: http://blog.divebomb.org/2011/07/my-first-c-cmake-googletest-and-googlemock/

然而,在我的測試,我仍然得到我的所謂「printf的」。有什麼想法嗎?

下面是類/頭文件:

A.H

#pragma once 
class A 
{ 
public: 
    virtual void methodToOverride(); 
    void someConcreteMethod(); 

    int mMemberVariable; 
}; 

A.cpp

#include "A.h" 

void A::methodToOverride() 
{ 
    std::printf("Hello World"); 
} 

void A::someConcreteMethod() 
{ 
} 

B.h

#include "A.h" 

class B 
{ 
public: 
    B(A &injectedClass); 
    ~B(); 
    void MethodToTest(); 

private: 
    A mA; 
}; 

B.cpp

#include "B.h" 

B::B(A & injectedClass):mA(injectedClass) 
{ 
    mA.someConcreteMethod(); 
} 

B::~B(){} 

void B::MethodToTest() 
{ 
    mA.methodToOverride(); 
} 

MockA.h

#include "A.h" 
#include "gmock\gmock.h" 

class MockA : public A 
{ 
public: 
    MOCK_METHOD0(methodToOverride, void()); 

}; 

BTest.cpp:

#include "gtest/gtest.h" 
#include "MockA.h" 
#include "B.h" 

using ::testing::AtLeast; 
using ::testing::_; 

TEST(BTest, mockObject) 
{ 
    // Arrange 
    MockA injectedMock; 
    EXPECT_CALL(injectedMock, methodToOverride()) 
     .Times(AtLeast(1)); 

    B classUnderTest(injectedMock); 

    // Act 
    classUnderTest.MethodToTest(); 
} 
+0

@Someprogrammerdude重新發布了這個問題,刪除原來的代碼,在這裏用確切的代碼...如果你有任何見解,他們將不勝感激! – Aerophilic

+0

@doctorlove從上一問題轉貼 – Aerophilic

+1

請不要刪除並重新發布相同的問題。改爲編輯現有問題。這也會將問題重新推回頭版。 –

回答

0

的一個主要問題是,B::mA研究所A類的一個。它不知道任何關於兒童課程和對象的知識。

成員B::mA或者需要是多態性工作的引用或指針。

+0

所以......當我去參考/指針的道路,當這個方法沒有被使用時這很好......但是當我嘗試使用「EXPECT」調用時,它最終變得奇怪的堆棧錯誤(特別是堆棧指針周圍的錯誤不正確匹配)。使用Google Mock有沒有更好的方法來實現這一點? – Aerophilic

+0

添加了我作爲基礎使用的網站...任何想法將不勝感激.... – Aerophilic