首頁 >後端開發 >C++ >C++ 單元測試中如何模擬外部相依性?

C++ 單元測試中如何模擬外部相依性?

WBOY
WBOY原創
2024-04-24 09:12:01967瀏覽

在 C 中模擬外部相依性有三種方法:1. 樁(預定義行為),2. 存根(記錄呼叫),3. 注入(作為參數傳遞模擬)。透過樁、存根和注入,可以隔離組件並創建健壯的單元測試。

C++ 单元测试中如何模拟外部依赖项?

C 單元測試中如何模擬外部相依性

在單元測試中,模擬外部相依性對於隔離各個元件的測試非常重要。以下三種方法可以在C 中輕鬆模擬外部相依性:

1. 樁(Stub)

樁是一種模擬,它提供預先定義的行為,而不會呼叫實際的依賴項。要建立樁,可以使用嘲諷框架,例如 Google Mock 或 CMocka。

// 使用 Google Mock 创建一个桩:
class MockExternalDependency {
 public:
  MOCK_METHOD(int, Function1, (int a, int b));
};

// 创建桩并用它替换实际的依赖项:
MockExternalDependency mockDependency;
EXPECT_CALL(mockDependency, Function1(1, 2)).WillOnce(Return(3));

// 测试代码:
int result = TestFunction(&mockDependency);
ASSERT_EQ(result, 3);

2. 存根(Stub)

存根與樁類似,但它不會預先定義行為。相反,它會記錄依賴項的呼叫並允許您檢查它們。這對於檢查輸入和呼叫順序非常有用。

// 使用 CMocka 创建一个存根:
void external_dependency_stub(int a, int b) {
  // 记录被调用的参数
}

// 设置存根并测试代码:
cmocka_set_stub(external_dependency, external_dependency_stub);
TestFunction();

// 检查存根中记录的调用:
ASSERT_TRUE(cmocka_call_count(external_dependency) > 0);

3. 注入

注入涉及將依賴項作為參數傳遞給被測試函數。這允許您輕鬆地替換依賴項的實現,以便在測試期間使用模擬。

// 使用依赖项注入进行测试:
void TestFunction(ExternalDependency& dependency) {
  // 使用模拟依赖项调用函数:
  MockExternalDependency mockDependency;
  EXPECT_CALL(mockDependency, Function1(1, 2)).WillOnce(Return(3));
  int result = TestFunction(&mockDependency);
  ASSERT_EQ(result, 3);
}

實戰案例:

假設我們有一個函數ReadFile,它依賴外部類別FileSystem 中的OpenFileReadFile 方法。為了對 ReadFile 進行單元測試,我們需要模擬 FileSystem

class MockFileSystem {
 public:
  MOCK_METHOD(FILE*, OpenFile, (const char* filepath));
  MOCK_METHOD(int, ReadFile, (FILE* file, char* buffer, int size));
};

void TestReadFile() {
  MockFileSystem mockFileSystem;
  FILE* mockFile = fopen("mockfile.txt", "w");
  EXPECT_CALL(mockFileSystem, OpenFile("mockfile.txt")).WillOnce(Return(mockFile));
  EXPECT_CALL(mockFileSystem, ReadFile(mockFile, testing::_, _))
      .WillOnce(SetArrayArgument<1>("Hello", 5));

  char buffer[10];
  int result = ReadFile("mockfile.txt", buffer, 10, &mockFileSystem);
  ASSERT_EQ(result, 5);
  ASSERT_STREQ(buffer, "Hello");
}

以上是C++ 單元測試中如何模擬外部相依性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn