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.
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);
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);
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); }
Kes praktikal:
Andaikan kita ada fungsi 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"); }
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!