NDA に違反する可能性のあるあらゆる種類のコード共有を保護するだけでなく、できるだけ多くの人に適用できるように、これを純粋に最小限の例にしようとします。これで大丈夫です!
私は CppUTest と CppUMock (gcc/g++ でコンパイルし、CMake で作成した makefile) を Gitlab 継続的インテグレーション ソフトウェアと組み合わせて使用し、将来のコミットとソフトウェアのリリースのための単体テスト環境を作成しています。しかし、私は少し問題に遭遇しました。次のフォルダー設定があるとします (/tests フォルダーの内容以外は、最小限の変更しかできません)。
+-- src
+-- driver1.c
+-- driver2.c
+-- inc
+-- driver1.h
+-- driver2.h
+-- tests
+-- test_driver1.cpp
+-- test_driver2.cpp
+-- main.cpp
+-- cmakelists.txt
CMakeLists ファイルには、inc フォルダーのインクルード、src フォルダーのコンパイル、tests フォルダーのコンパイルが含まれます。ただし、driver2.c が driver1.c で定義されたメソッドに依存しているとします。driver2 のメソッドへの呼び出しの結果を通常どおりにテストできるため、モックのセットアップがない場合はこれで問題ありません。ただし、driver2 が method1 を正しく (CppUMock を使用して) 呼び出すことを確認できるように、driver1 の method1 関数をモックしたいとします。driver1 がコンパイルされていない場合、これは通常は問題ありませんが、test_driver2.cpp ファイルに次のようなものを追加します。
void method1(int n) {
mock().actualCall("method1").withParameter("n", n);
}
driver1.c の実際の method1 と衝突し、次のようなリンカ エラーが発生します。
CMakeFiles/Tests.dir/.../src/driver1.c:(.text+0x11d): multiple definition of 'method1'
CMakeFiles/Tests.dir/.../src/test_driver2.cpp:(.text+0x0): first defined here
コメンターの要求に従って、インクルード構造は次のようになります。
driver1.c includes driver1.h (obviously)
driver2.c includes driver2.h (obviously)
driver2.h includes driver1.h (for calling method1)
test cpp files include their respective .h files
(test_driver1.cpp -> driver1.h and test_driver2.cpp -> driver2.h)
method1 は driver1.h で宣言され、driver1.c で定義されます。これらのファイルを編集できません。
リクエストに応じて詳細を追加します。
この嘲笑の問題を回避する最善の方法は何ですか?