2017-06-22 66 views
0

我想要測試一個基類的方法是否使用Google Mock測試調用並執行。我有一個簡單的BankAccount類來實現一個函數撤銷。在BankAccount.h文件:如何測試一個基類的方法是否已被調用並使用谷歌模擬執行?

class BankAccount { 

public: 

    BankAccount(); 

    int withdraw(int balance, int withdrawalAmount); 

}; 

在BankAccount.cpp文件:

#include "BankAccount.h" 

BankAccount::BankAccount() 
{ 
} 

int BankAccount::withdraw(int balance, int withdrawalAmount) 
{ 
    if (withdrawalAmount <= balance) 
    { 
     balance -= withdrawalAmount; 
    } 

    return balance; 
} 

在test.h文件我有:

#include "BankAccount.h" 

class MockBankAccount : public BankAccount { 

public: 

    MockBankAccount(); 

    MOCK_METHOD2(withdraw, int(int balance, int withdrawalAmount)); 
}; 

我MockBankAccount類從繼承的BankAccount類。

在我TEST.CPP文件:

#include <gtest/gtest.h> 
#include <gmock/gmock.h> 
#include "test.h" 

using namespace testing; 

// Constructors/Destructors 

MockBankAccount::MockBankAccount() 
{ 
} 

TEST(WithdrawAccountTest, Withdraw) 
{ 
    MockBankAccount mockAccount; 

    EXPECT_CALL(mockAccount, withdraw(5, 1)) 
     .Times(1); 

    mockAccount.withdraw(5, 1); 
} 

// Main 
int main(int argc, char* argv[]) 
{ 
    InitGoogleTest(&argc, argv); 
    InitGoogleMock(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

我要檢查撤回方法被調用,並從BankAccount類(即的BankAccount ::撤回執行)執行。當我運行測試時,它會通過,我期望撤回已被調用並執行,但是,如果我在BankAccount :: withdraw和debug上放置斷點,我可以看到它從未實際從基類到達該方法。有沒有辦法使用Google Mock來檢查BankAccount :: withdraw,例如使用其他方法(組合而不是繼承,模板等)?

回答

0

我想嘗試給你一個可以接受的答案。

首先,代碼做它應該是什麼。當然你可以在測試中調用「模擬方法」和測試通過。但是測試永遠不會調用基類的方法(這是正確的)。順便說一句,如果一個方法被調用,然後直接調用這個方法,那麼測試就沒有意義了。

但讓我們來談談嘲笑。當測試類對其他類有依賴關係時,您只需要Mocks。
考慮一個類Person,它對BankAccount類有依賴性,並且您想測試類Person測試時,單獨測試一個對象非常重要。這就是爲什麼你不想要,Person談到BankAccount類的實例。這裏來嘲諷......

試想一下,這裏面除了到類Person類:

class Person { 
public: 
    Person(BankAccount *account, int balance) : ba(account), balance(balance) {} 
    int getMoneyfromBankAccount(int withdrawalAmount) { 
     ba->withdraw(balance, withdrawalAmount); 
    } 
private: 
    BankAccount *ba; 
    int balance; 
} 

和測試修改:

TEST(PersonTest, testWhenPersonGetsMoneyFromTheBankAccount_withdrawIsCalled) 
{ 
    MockBankAccount mockAccount; 

    EXPECT_CALL(mockAccount, withdraw(5, 1)) 
     .Times(1); 

    Person p(&mockAccount, 5); 
    p.getMoneyfromBankAccount(1); 
} 

,不要忘記使銀行帳戶方法虛擬:

virtual int BankAccount::withdraw(int balance, int withdrawalAmount) 

畢竟,如果你只是想測試的方法withdraw()從類BankAccount,你不需要任何嘲笑。

相關問題