2012-01-17 82 views
4

我知道這個問題的第一部分已被asked before,但那是很久以前的:)。我想知道在開發模擬非虛擬方法和C函數時,任何開源嘲諷框架的平均時間是否都趕上了Typemock Isolator ++。我最感興趣的是Linux下的gcc。到目前爲止,我對模仿訪問器感興趣(以便我可以在模擬對象中模擬狀態 - 參見下文),並從其他庫(select,pcap_ *等)中替換C函數。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 2012-01-17 17:11:05

回答

5

GMock支持他們稱爲hi-perf依賴注入爲mocking non-virtual methods

的要點,從上面的鏈接,是使用模板:

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)命名空間中訪問模擬函數,因此測試代碼將調用T :: time()而不是time()。這相當於使用抽象接口而不是具體類。

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

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

我有好運氣,在過去的Cxxtest方法。

0

隨着近來GCC(例如4.6),則能寫在C插件,或者在MELT用於該目的的延伸。

但是,要定製GCC(通過C中的插件或MELT中的擴展),需要部分理解其內部表示(Gimple和Tree-s),這需要時間(可能需要超過一週的工作時間)。因此,如果您擁有足夠大的代碼庫值得付出努力,這種方法纔有意義。