2012-01-17 32 views
4

私はこの質問の最初の部分がasked beforeでしたが、それはずっと前でした:)。私は、非仮想メソッドとC関数を嘲笑するときに、オープンソースの模擬フレームワークのどれかがTypemock Isolator ++に追いついたのかどうか疑問に思っていました。私は主にLinuxのgccに興味があります。これまでは、アクセサーを嘲笑することに興味がありました(私は嘲笑されたオブジェクトの状態をシミュレートできるように - 下記参照)、C関数を他のライブラリ(select、pcap_ *など)から置き換えることができます。最近のGCC(例えば4.6)で非仮想メソッドとC関数をモックすることができるC++モックフレーム

class Foo { 
    public: 
    ... 
    bool IsCondition() { return condition; }; 
    ... 
    private: 
    bool condition; 
} 

// I want a framework that allows me to do something like this: 
TEST(TestFoo) { 
    MOCK_INTERFACE(Foo) mock_foo; 
    EXPECT_CALL(mock_foo, IsCondition).returns(true); 
    EXPECT(mock_foo.IsCondition()); 
} 
+1

C++ 11のバリデーショナルテンプレートと完璧な転送では、探しているものを実装するのが以前よりはるかに簡単だったはずです。 – Flexo

答えて

5

GMockは、mocking non-virtual methodsのhi-perf依存性注入をサポートしています。

要旨は、上記のリンクから、テンプレートを使用することです:

template <class PacketStream> 
void CreateConnection(PacketStream* stream) { ... } 

template <class PacketStream> 
class PacketReader { 
public: 
    void ReadPackets(PacketStream* stream, size_t packet_num); 
}; 

はその後、生産コードでのCreateConnection()とPacketReaderを使用し、テストでのCreateConnection()とPacketReaderを使用することができます。

Cの関数については、インターフェイスを推奨しているので、おそらくあなたが望むものではありません。ただし、別々のライブラリがある場合は、デプロイメントライブラリと同じシグネチャの関数を含むテストライブラリに常にリンクすることができます。 LD_PRELOADを使ってダイナミックに行うこともできます。それは私にたくさんのリンクがあるように思えます。

Cxxtest、あなたがadvanced featuresでセクション8.1の下を見れば容易にインタフェースを作成/使用して作るためにいくつかのマクロをサポートしています。

そのリンクから:

CXXTEST_MOCK_GLOBAL(time_t,  /* Return type   */ 
        time,   /* Name of the function */ 
        (time_t *t), /* Prototype   */ 
        (t)   /* Argument list  */); 

8.1.2. Mock Functions in Tested Code 

テストコードがモックグローバル関数を使用して、グローバル関数を直接使用するのではなく、 T(for Test)名前空間のモック関数にアクセスするので、テストされたコードはtime()の代わりにT :: time()を呼び出します。これは、具象クラスの代わりに抽象インターフェースを使用するのと同じです。

// rand_example.cpp 
#include <time_mock.h> 

int generateRandomNumber() 
{ 
    return T::time(NULL) * 3; 
} 

私は過去にCxxtestアプローチと幸運を持っていました。

0

、あなたはCで、プラグイン、またはその目的のためにMELTに拡張子を書くことができます。

しかし、GCC(CのプラグインまたはMELTの拡張機能)をカスタマイズするには、内部表現(GimpleとTree-s)を部分的に理解する必要がありますが、時間がかかります(おそらく1週間以上の作業)。したがって、このアプローチは、その価値のある十分なコードベースがあれば理にかなっています。

関連する問題