2012-01-17 162 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),这需要时间(可能需要超过一周的工作时间)。因此,如果您拥有足够大的代码库值得付出努力,这种方法才有意义。