Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verspotte ich externe Abhängigkeiten in C++-Komponententests?

Wie verspotte ich externe Abhängigkeiten in C++-Komponententests?

WBOY
WBOYOriginal
2024-04-24 09:12:01878Durchsuche

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.

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

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 中的 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");
}

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn