NDAに違反する可能性のあるコード共有を可能な限り多くの人に適用できるだけの純粋な最小限の例にしようと考えています。これは大丈夫ですね!CppUTestユニットテストフレームワーク複数定義例外
Gitlab Continuous Integrationソフトウェアと組み合わせてCppUTestとCppUMock(gcc/g ++でコンパイルし、makefileで作成したもの)を使用して、今後のコミットとソフトウェアのリリース用の単体テスト環境を作成しています。しかし、私は少し問題に遭遇しました。のは、私は次のフォルダを設定しているとしましょう(私は/テストフォルダの内容以外に変更する最小限の能力を、持っていること):
+-- 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によって定義されたメソッドに依存しているとします。これは、正常にドライバ2のメソッドの呼び出しの結果をテストすることができるので、モック設定がない場合は正常です。しかし、driver2のmethod1を正しく呼び出すことができるように、driver1のmethod1関数をモックしたいとします(CppUMockを使用)。
void method1(int n) {
mock().actualCall("method1").withParameter("n", n);
}
は、リンカエラーなどでdriver1.cに実際の法1との衝突が発生します。test_driver2.cppファイルになるようDRIVER1はコンパイルが、のようなものを追加されていなかった場合、これは通常、大丈夫だと思いますそう:
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で定義されます。ここで
コメント投稿者の要求ごととしてCMakeFiles/Tests.dir/.../src/driver1.c:(.text+0x11d): multiple definition of 'method1'
CMakeFiles/Tests.dir/.../src/test_driver2.cpp:(.text+0x0): first defined here
には、構造がどのようなものであるかであります私はこれらのファイルを編集できません。
リクエストに応じて詳細を追加できます。
この問題を回避するにはどうすればよいでしょうか?
method1を定義する部分と、さまざまなヘッダーをソースにどのように含めるかを(少なくとも抜粋して)表示する必要があります。 – TemplateRex
@TemplateRex added includes。 method1は、driver1.hファイルの宣言を含む、driver1.cファイル内の古いメソッドです。 – Jeffrey
driver2.cppに別の 'method1()'を追加してdriver2.cppと一緒にテストドライバにリンクすることはできません。あなたが馬鹿にしたいのであれば、CMakeにtest1driver2.cppの依存関係としてdriver1.cppをコンパイルしないように伝えてください。 – TemplateRex