Es gibt drei Möglichkeiten, externe Abhängigkeiten in C++ zu verspotten: 1. Stubbing (vordefiniertes Verhalten), 2. Stubbing (Aufrufe protokollieren), 3. Injektion (Übergabe von Mocks als Argumente). Durch Stubbing, Stubbing und Injektion können Sie Komponenten isolieren und robuste Unit-Tests erstellen.
So verspotten Sie externe Abhängigkeiten in C++-Unit-Tests
Bei Unit-Tests ist das Verspotten externer Abhängigkeiten sehr wichtig, um das Testen einzelner Komponenten zu isolieren. Hier sind drei Möglichkeiten, externe Abhängigkeiten in C++ einfach zu verspotten:
1. Stub
Ein Stub ist ein Mock, der vordefiniertes Verhalten bereitstellt, ohne die eigentliche Abhängigkeit aufzurufen. Zum Erstellen von Stubs können Sie ein Mocking-Framework wie Google Mock oder CMocka verwenden.
// 使用 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
Ein Stub ähnelt einem Stub, hat aber kein vordefiniertes Verhalten. Stattdessen werden Aufrufe von Abhängigkeiten protokolliert und Sie können diese überprüfen. Dies ist nützlich, um die Eingabe- und Aufrufreihenfolge zu überprüfen.
// 使用 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. Injektion
Bei der Injektion werden Abhängigkeiten als Parameter an die zu testende Funktion übergeben. Auf diese Weise können Sie die Implementierung einer Abhängigkeit einfach ersetzen, um beim Testen Mocks zu verwenden.
// 使用依赖项注入进行测试: void TestFunction(ExternalDependency& dependency) { // 使用模拟依赖项调用函数: MockExternalDependency mockDependency; EXPECT_CALL(mockDependency, Function1(1, 2)).WillOnce(Return(3)); int result = TestFunction(&mockDependency); ASSERT_EQ(result, 3); }
Praktischer Fall:
Angenommen, wir haben eine Funktion ReadFile
,它依赖于外部类 FileSystem
中的 OpenFile
和 ReadFile
方法。为了对 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"); }
Das obige ist der detaillierte Inhalt vonWie verspotte ich externe Abhängigkeiten in C++-Komponententests?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!