Bagaimana untuk mengejek kebergantungan luaran dalam ujian unit C++?

WBOY
Lepaskan: 2024-04-24 09:12:01
asal
934 orang telah melayarinya

Terdapat tiga cara untuk mengejek kebergantungan luar dalam C++: 1. Stubbing (tingkah laku yang dipratentukan), 2. Stubbing (panggilan log), 3. Suntikan (lulus ejekan sebagai hujah). Melalui stub, stub dan suntikan, anda boleh mengasingkan komponen dan membuat ujian unit yang mantap.

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

Cara mengejek kebergantungan luaran dalam ujian unit C++

Dalam ujian unit, mengejek kebergantungan luaran adalah sangat penting untuk mengasingkan ujian komponen individu. Berikut ialah tiga cara untuk mengejek kebergantungan luaran dengan mudah dalam C++:

1 Stub

Stub ialah olok-olok yang menyediakan tingkah laku yang dipratentukan tanpa memanggil kebergantungan sebenar. Untuk membuat stub, anda boleh menggunakan rangka kerja mengejek seperti Google Mock atau 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);
Salin selepas log masuk

2. Stub

Stub adalah serupa dengan stub, tetapi ia tidak mempunyai tingkah laku yang telah ditetapkan. Sebaliknya, ia mencatatkan panggilan ke tanggungan dan membolehkan anda memeriksanya. Ini berguna untuk menyemak pesanan input dan panggilan.

// 使用 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);
Salin selepas log masuk

3. Suntikan

Suntikan melibatkan melepasi kebergantungan sebagai parameter kepada fungsi yang diuji. Ini membolehkan anda dengan mudah menggantikan pelaksanaan kebergantungan untuk menggunakan olok-olok semasa ujian.

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

Kes praktikal:

Andaikan kita ada fungsi 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");
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk mengejek kebergantungan luaran dalam ujian unit C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan