0

CMockeryモックで、重複するシンボル警告が発生するという問題が発生しています。

コードの実装は非常に長いので、ここに要点があります

Gistには、test(.c)、implementation( )、およびヘッダーファイルが含まれています。プロジェクトは、を使用し.cてビルドCMakeおよびテストされます。CTestCMockery

実際のエラーは次のとおりです。

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

更新:診断に役立つビルド出力をここに追加しました

4

1 に答える 1

0

*wit_configuration_file_path* をモック アウトしようとすると、テスト中の関数 *wit_load_configuration* と同じソース ファイルに含まれます。これは不可能です。リンカは、wit_configuration_file_path の元の実装とモック化されたバージョンを確認します。

CMockery には、モッキングのための非常に粗い範囲があります。最終的には、完全なソース ファイルをモックアウトすることしかできません。2 つの関数が同じソース ファイルにある場合、それらは両方ともモック アウトされるか、両方とも「テスト対象のシステム」に含まれます。

この場合どうすればいいですか?*wit_configuration_file_path* をモックアウトしたり、別のソース ファイルに配置したりしないでください。*wit_load_configuration* と *wit_configuration_file_path* は非常に関連性が高いため、おそらく関数をモックアウトしないことが最善の解決策です。

于 2012-09-26T11:43:01.613 に答える