6

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 で定義されます。これらのファイルを編集できません。

リクエストに応じて詳細を追加します。

この嘲笑の問題を回避する最善の方法は何ですか?

4

1 に答える 1