5

cpp の初心者 (Java のやつ)。

メソッドsendMail(txt)を持つサードパーティのライブラリがあります。ライブラリをテストしたくありません。私は自分のメソッドをテストしたいので、これを行うには、ライブラリ呼び出しをモックする必要があります。

私自身の方法は次のようになります。

#include "mailsender.h"

int run(txt){
    analysis(txt);
    ...
    ...
    int status =  sendMail(txt);//sendMail is a 3rd party library call. i need to mock it.its not part of the unit test
    return status;
}

Javaでは、メール送信者はインターフェースであり、それが私のクラスに注入されたので、テストの場合はモックを注入します。cppでライブラリ呼び出しをモックするための良い習慣は何ですか? サードパーティのライブラリ呼び出しをクラスにラップしてこのクラスを挿入できますが、より単純で一般的な方法 (おそらく ifndf) を探しています。

私はグーグルモックに精通しています。googlemock を使用すると、クラスをモックできます。テストしたメソッドで呼び出しをモックする方法を選択することを知りません。

4

4 に答える 4

5

したがって、(定義を取得するための) ヘッダー ファイルと (実装を取得するための) リンクの両方を含むライブラリに実装されている「グローバル」関数があると仮定します。

ライブラリの実装を独自のものに置き換える必要があることは明らかです-「何もしない」ため、2つの方法でこれを行うことができます:

  • .dll (または .so) を、サードパーティ ライブラリが公開するすべてのメソッドを含む独自の実装に置き換えます。これは、すべてのサード パーティの lib 関数の新しいバージョンを作成すれば簡単ですが、すべてを書き出すのは面倒です。
  • ライブラリを一時的に削除し、これらの関数を実装する .cpp ソース ファイル内の呼び出しを置き換えます。したがって、独自の sendMail() 関数を .cpp ファイルに作成し、これを mailsender.h インクルードの代わりにプログラムに含めます。

後者の方が簡単ですが、サードパーティのライブラリとリンクしないようにプログラムを変更する必要がある場合もあります。一部のコンパイラ (VC++ など) ではソースにリンカー ディレクティブを埋め込むことができるため、これには #include の変更も必要になる場合があります。これを行うと、リンカーがサードパーティのライブラリを含めるのを止めることができなくなります。

もう 1 つのオプションは、sendMail 呼び出しに別の呼び出しを使用するようにコードを変更することです。たとえば、自分で実装した test__sendMail() です。これは、ビルド オプションに応じて、条件付きで、または実際の関数呼び出しを含めるためのマクロです。

これが C++ ライブラリの場合、おそらく慣れ親しんだモック フレームワークを使用できますが、C ライブラリのように聞こえ、コードで直接使用する関数のリストを提供するだけです。ライブラリを独自のクラスでラップし、サードパーティの lib 関数を直接呼び出す代わりにそれを使用できます。

C モッキング フレームワークのリストがあります。

于 2012-07-27T12:20:01.587 に答える
0

キーワードはありませんがinterface、C++ で同様のことを行うために抽象基底クラスを使用できます。

使用しているライブラリにそのような抽象化が含まれていない場合は、独自の「インターフェイス」の背後にラップできます。コードがオブジェクトの構築と使用を分離している場合 (IoC など)、これを使用して偽物を挿入するか、モックを使用できます。

https://stackoverflow.com/questions/38493/are-there-any-good-c-mock-object-frameworks

于 2012-07-27T11:44:54.323 に答える