VS 2022

Demo_1

  1. #include <iostream>
  2. #include <gtest/gtest.h>
  3. #include <gmock/gmock.h>
  4. using namespace testing;
  5. class Foo {
  6. public:
  7. virtual int count() = 0;
  8. };
  9. class MockFoo : public Foo {
  10. public:
  11. MOCK_METHOD0(count, int());
  12. };
  13. class Bar {
  14. public:
  15. Bar(Foo* foo) : m_foo(foo) { }
  16. int count() { return m_foo->count(); }
  17. private:
  18. Foo* m_foo;
  19. };
  20. TEST(BarTest, mock_foo_in_bar) {
  21. MockFoo* mockFoo = new MockFoo();
  22. Bar* bar = new Bar(mockFoo);
  23. EXPECT_CALL(*mockFoo, count())
  24. .Times(3)
  25. .WillOnce(Return(3))
  26. .WillOnce(Return(6))
  27. .WillOnce(Return(5));
  28. EXPECT_EQ(bar->count(), 3);
  29. EXPECT_EQ(bar->count(), 6);
  30. EXPECT_EQ(bar->count(), 5);
  31. delete bar;
  32. delete mockFoo;
  33. }
  34. int main(int argc, char** argv)
  35. {
  36. testing::InitGoogleTest(&argc, argv);
  37. return RUN_ALL_TESTS();
  38. }
  1. [==========] Running 1 test from 1 test suite.
  2. [----------] Global test environment set-up.
  3. [----------] 1 test from BarTest
  4. [ RUN ] BarTest.mock_foo_in_bar
  5. [ OK ] BarTest.mock_foo_in_bar (0 ms)
  6. [----------] 1 test from BarTest (1 ms total)
  7. [----------] Global test environment tear-down
  8. [==========] 1 test from 1 test suite ran. (2 ms total)
  9. [ PASSED ] 1 test.

Demo_2: 桩掉C函数

Demo_3

  1. #include <gtest/gtest.h>
  2. #include <gmock/gmock.h>
  3. #include <iostream>
  4. using namespace std;
  5. using ::testing::AtLeast;
  6. using ::testing::Return;
  7. using ::testing::_;
  8. class DataBaseConnect
  9. {
  10. public:
  11. virtual bool login(string username, string password) { return true; }
  12. virtual bool logout(string username) { return true; }
  13. virtual int fetchRecord() { return -1; }
  14. };
  15. class MockDB : public DataBaseConnect
  16. {
  17. public:
  18. MOCK_METHOD0(fetchRecord, int());
  19. MOCK_METHOD1(logout, bool (string username));
  20. MOCK_METHOD2(login, bool (string username, string password));
  21. };
  22. class MyDatabase
  23. {
  24. DataBaseConnect& dbC;
  25. public:
  26. MyDatabase(DataBaseConnect& _dbC) :dbC{_dbC}{}
  27. int Init(string username, string password)
  28. {
  29. if (dbC.login(username, password) != true)
  30. {
  31. cout << "DB FAILTURE\n"; return -1;
  32. }
  33. else
  34. {
  35. cout << "DB SUCCESS\n"; return 1;
  36. }
  37. }
  38. };
  39. TEST(MyDBTest, LoginTest)
  40. {
  41. // Arrange
  42. MockDB mdb;
  43. MyDatabase db{ mdb };
  44. EXPECT_CALL(mdb, login("Terminator", "I'm Back"))
  45. .Times(1)
  46. .WillOnce(Return(true));
  47. // Act
  48. int retValue = db.Init("Terminator", "I'm Back");
  49. // Assert
  50. EXPECT_EQ(retValue, 1);
  51. }
  1. [==========] Running 1 test from 1 test suite.
  2. [----------] Global test environment set-up.
  3. [----------] 1 test from MyDBTest
  4. [ RUN ] MyDBTest.LoginTest
  5. DB SUCCESS
  6. [ OK ] MyDBTest.LoginTest (0 ms)
  7. [----------] 1 test from MyDBTest (0 ms total)
  8. [----------] Global test environment tear-down
  9. [==========] 1 test from 1 test suite ran. (1 ms total)
  10. [ PASSED ] 1 test.