一部の C/C++ プロジェクトで CppUTest の使用を開始しています。特にモッキング拡張機能は良さそうですが、どうやってモックを設定すればいいのか、今悩んでいます。ネットワーク ソケット通信を抽象化するための低レベル クラスを想定します。
私の最初の方法:
size_t CMockSocket::recv(void* buf, size_t len) { return (size_t) mock().actualCall("recv") .withParameter("len", (int) len) .returnValue().getIntValue(); }
期待値の設定:
mock().expectOneCall("recv") .withParameter("len", 20) .andReturnValue(15);
ここまでは順調ですね。しかし、私が必要とするのは、より多くのデータを提供することです。この場合、buf ポインターを介して返したい 15 バイトです。.setData()
とsetDataObject()
メソッドを使用しようとしました。しかし、関数は、予想される関数呼び出しではなく、名前付き変数にデータを格納しているようです。したがって、後続の呼び出しは前のデータを上書きしますよね?
私の現在の問題は、追加の戻りデータをモッキングメソッドに渡すにはどうすればよいですか? これに対する私の最初のアプローチは、戻り値 (size_t) とデータ バッファーの両方を含む結果のクラスを作成することでした。このような:
クラス CRecvResults { 公衆: size_t m_returnValue; ボイド* m_buffer; CRecvResults(size_t returnValue, void* バッファ) : m_returnValue(戻り値)、m_buffer(バッファ) {} 〜CRecvResults() {} }; size_t CMockSocket::recv(void* buf, size_t len) { CRecvResults* pResults = (CRecvResults*) モック().actualCall("recv") .withParameter("len", (int) len) .returnValue().getPointerValue()); assert (pResults != NULL); assert(buf != NULL); assert(len >= pResults->m_buffer.length()); memcpy(buf, pResults->m_buffer.data(), pResults->m_buffer.length()); pResults->m_returnValue を返します。 }
そして期待:
char* buffer = "少なくとも 15 文字の長さのバッファ コンテンツを返します"; CRecvResults 結果 (15、バッファー); mock().expectOneCall("recv") .withParameter("len", 20) .andReturnValue(&results);
質問:これは正しい方法ですか、それとも何か見逃していますか?結果インタープリターをテストする必要があるため、バッファーの内容が必要です。
私の2番目の方法:
bool CMockSocket::send(const void* buf, size_t len) { return mock().actualCall("send") .withParameter("len", (int) len) .returnValue().getIntValue(); }
期待値の設定:
mock().expectOneCall("送信") .withParameter("len", 20) .andReturnValue(真);
この場合、テスト対象のコードによって生成された buf の発信データを検証したいと考えています。したがって、そのバッファーの内容 (および長さ) をテスト関数に返す必要があります。このような:
クラスCSendResults { 公衆: bool m_returnValue; char* m_buffer; size_t m_length; CSendResults(bool returnValue, char* buffer, size_t length) : m_returnValue(戻り値)、m_buffer(バッファ)、m_length(長さ) {} ~CSendResults() {} }; bool CMockSocket::send(const void* buf, size_t len) { CSendResults* pResults = (CSendResults*) モック().actualCall("送信") .returnValue().getPointerValue(); assert (pResults != NULL); assert(buf != NULL); assert (pResults->m_length >= len); memcpy(pResults->m_buffer, buf, len); pResults->m_length = len; pResults->m_returnValue を返します。 }
そして期待:
文字バッファ[1024]; CSendResults 結果 (真、バッファー、sizeof (バッファー); mock().expectOneCall("送信") .withParameter("len", 20) .andReturnValue(&results); // 結果の内容をさらにチェックします...
これは非常に見苦しく、私には多くのオーバーヘッドがあります。再び私の質問:これは正しい方法ですか、それとも何か見逃していますか?
そして私の最後の質問: 完全に間違った方法でテストしている可能性はありますか? 経験談や実践を教えてください!