2016-07-30 4 views
3

いくつかのAPIコールをチェックするための単体テストを書いています。私はテストにチェックを使用しています。私のモジュールはCMakeでビルドされています(重要な場合はidk)。C言語での関数のモック?

私のテストは関数(これはテストする必要があります)を呼び出し、この関数は別のバイナリを呼び出します。

簡略化したバージョンは次のようになります。

/* unitTest.c */ 

#include "libraryAPI.h" 
void letsMakeACall(void) 
{ 
    ck_assert_eq(foo("water"), 0); 
} 

-- Module I am working on--- 
/*libraryAPI.c*/ 
#include "legacyLib.h" 

void foo(const char *drink)  
{ 

    if (checkDrink(drink)!=0) 
    { 
     return 1; 
    }else 
    { 
     return 0; 
    } 
} 


----LEGACY BINARY--- 
/*legacyLib.c*/ 

static const char* expected = "water"; 

void checkDrink(const char *drink) 
{ 
    if(drink == expected) 
    { 
     /*There are also a dozen functions being called which depend on legacy module initialisation*/ 
     return 0; 
    }else{ 
     return 1; 
    } 
} 

私はlegacyLibからの応答を模擬したいと思います。そうしないと、何十という機能やブレークが呼び出されるからです。私の最初のアイデアは、テストが実行されているときにいくつかのifdef条件を追加することでしたが、それはガイドラインに違反していました。 基本的にはコールの傍受であるため、私はそれが最良の(または動作する)ソリューションであるかどうかわかりません。私はそれを解決するために何が使えますか?

+0

関数をテストする場合は、それを "模擬する"ことはできません。 –

+0

はい、私はテストしようとしている関数によって呼び出されている関数のうちの1つからの応答を模擬したいと思います。 – Oreols

+2

その関数はどこに定義されていますか?その機能を実装しているライブラリを "モック"ライブラリに置き換えることはできますか? –

答えて

2

私はまた、一般的にこの問題を解決する方法がわからないです、私はsimilar questionを掲載しているが、いくつかのケースでは、あなたは(あなたが個々の機能をテストしている前提)次の操作を実行できます。

  1. ではなく.cファイルをインクルードヘッダ.hのが、あなたはディレクティブを定義し使用して嘲笑機能を「名前の変更」後:

    #define checkDrink checkDrink_mocked 
    // preprocessor will now replace all occurrences of "checkDrink" 
    // with "checkDrink_mocked" 
    
    int checkDrink_mocked(const char *drink); 
    #include "legacyLib.c" 
    #undef checkDrink 
    
  2. 名前を変更した機能の実装:

    int checkDrink_mocked(const char *drink) 
    { 
        return 15; 
    } 
    
+0

ありがとうございます。私はこれが最善の解決策だと思う。私の場合、それは非常に単純なgetter-setterリファレンスだったので、私はちょうど私のモジュールを再実装しました(愚かなものに依存しない:))。 – Oreols

+0

うまくいくとうれしいです。例えば、いくつかの 'libraryAPI.c'関数が別のモジュールからいくつかのextern関数を呼び出すと、' libraryAPI.c'(この場合は 'checkDrink')から元の関数を呼び出すと、簡単に失敗することがあります。元の関数を見つけてください。私はmimick([Snaipe/Mimick](https://github.com/Snaipe/Mimick))と呼ばれるライブラリを見つけました(著者はまだアルファフェーズであると言います)。実行時の動的モジュール "*、しかし私はそれを試していない(明らかにGCC 4.6+、Clang 3.5+、MSVC 14+をサポートしている)。 – Lou