VS 2022
Demo_1
#include <iostream>#include <gtest/gtest.h>#include <gmock/gmock.h>using namespace testing;class Foo {public: virtual int count() = 0;};class MockFoo : public Foo {public: MOCK_METHOD0(count, int());};class Bar {public: Bar(Foo* foo) : m_foo(foo) { } int count() { return m_foo->count(); }private: Foo* m_foo;};TEST(BarTest, mock_foo_in_bar) { MockFoo* mockFoo = new MockFoo(); Bar* bar = new Bar(mockFoo); EXPECT_CALL(*mockFoo, count()) .Times(3) .WillOnce(Return(3)) .WillOnce(Return(6)) .WillOnce(Return(5)); EXPECT_EQ(bar->count(), 3); EXPECT_EQ(bar->count(), 6); EXPECT_EQ(bar->count(), 5); delete bar; delete mockFoo;}int main(int argc, char** argv){ testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();}
[==========] Running 1 test from 1 test suite.[----------] Global test environment set-up.[----------] 1 test from BarTest[ RUN ] BarTest.mock_foo_in_bar[ OK ] BarTest.mock_foo_in_bar (0 ms)[----------] 1 test from BarTest (1 ms total)[----------] Global test environment tear-down[==========] 1 test from 1 test suite ran. (2 ms total)[ PASSED ] 1 test.
Demo_2: 桩掉C函数
Demo_3
#include <gtest/gtest.h>#include <gmock/gmock.h>#include <iostream>using namespace std;using ::testing::AtLeast;using ::testing::Return;using ::testing::_;class DataBaseConnect{public: virtual bool login(string username, string password) { return true; } virtual bool logout(string username) { return true; } virtual int fetchRecord() { return -1; }};class MockDB : public DataBaseConnect{public: MOCK_METHOD0(fetchRecord, int()); MOCK_METHOD1(logout, bool (string username)); MOCK_METHOD2(login, bool (string username, string password));};class MyDatabase{ DataBaseConnect& dbC;public: MyDatabase(DataBaseConnect& _dbC) :dbC{_dbC}{} int Init(string username, string password) { if (dbC.login(username, password) != true) { cout << "DB FAILTURE\n"; return -1; } else { cout << "DB SUCCESS\n"; return 1; } }};TEST(MyDBTest, LoginTest){ // Arrange MockDB mdb; MyDatabase db{ mdb }; EXPECT_CALL(mdb, login("Terminator", "I'm Back")) .Times(1) .WillOnce(Return(true)); // Act int retValue = db.Init("Terminator", "I'm Back"); // Assert EXPECT_EQ(retValue, 1);}
[==========] Running 1 test from 1 test suite.[----------] Global test environment set-up.[----------] 1 test from MyDBTest[ RUN ] MyDBTest.LoginTestDB SUCCESS[ OK ] MyDBTest.LoginTest (0 ms)[----------] 1 test from MyDBTest (0 ms total)[----------] Global test environment tear-down[==========] 1 test from 1 test suite ran. (1 ms total)[ PASSED ] 1 test.