CMockeryモックで、重複するシンボル警告が発生するという問題が発生しています。
コードの実装は非常に長いので、ここに要点があります。
Gistには、test(.c
)、implementation( )、およびヘッダーファイルが含まれています。プロジェクトは、を使用し.c
てビルドCMake
およびテストされます。CTest
CMockery
実際のエラーは次のとおりです。
ld: duplicate symbol _wit_configuration_file_path in ../libwatchedit.a(configuration.c.o) and CMakeFiles/libwatcheditTest.dir/configuration_test.c.o for architecture x86_64
私が思いついた回避策はchar *wit_configuration_file_path()
、として宣言することでしたstatic
。実装はint wit_load_configuration(wit_configuration config)
私が期待した実装と同じファイルにあるので、実際にはきれいにコンパイルおよびリンクされます。wit_configuration_file_path()
残念ながら、静的であると宣言することの副作用として、モックを使用することはありません。
cmockeryのグーグルの例はあまりにも工夫されており、これにどのように対処すべきかを説明していません。
関数を次のように宣言しない方が賢く、テストが簡単になる可能性もあります。
int wit_load_configuration(wit_configuration config);
むしろ:
int wit_load_configuration(char* filepath, wit_configuration, config);
その場合、私は何もモックしたりスタブしたりする必要はありません。しかし、将来何かをモックする必要があると予想しているので、問題が再発して私を噛むと信じています(そうでなければ、包括的な単体テストをどのように書くことができますか?)
1:これを適切に行うにはどうすればよいですか。static
つまり、モックを使用せずstatic
、重複するシンボルエラーを発生させずに宣言します。
2:APIのデザインを変更する必要がありますか?この場合はうまくいくでしょうが、関数を正しくモックする方法を知りたいです。
3:ライブラリ全体に対してテストをリンクするのは間違いですか、CMakeを使用しており、テストのtarget_link_libraries(libwatcheditTest watchedit)
行を使用しています。CMakeLists.txt
更新:診断に役立つビルド出力をここに追加しました