C ++模拟框架,可以模拟非虚拟方法和C函数

我知道这个问题的第一部分之前已经被问过了 ,但那是很久以前的:)。 我想知道是否平均时间的任何开源嘲笑框架赶上了Typemock的Isolator ++嘲讽非虚拟方法和C函数。 我最感兴趣的是Linux下的gcc。 到目前为止,我对mocking访问器感兴趣(这样我就可以模拟mocked对象中的状态 – 见下文),并从其他库(select,pcap_ *等)中replaceC函数。

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()); } 

GMock支持他们所谓的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 ,如果你在高级功能 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方法祝你好运。

有了最近的GCC(例如4.6),你可以用C编写一个插件,或者为此目的在MELT中编写一个扩展。

但是,要定制GCC(通过C中的插件或MELT中的扩展),需要部分理解其内部表示(Gimple和Tree-s),这需要花费时间(可能需要超过一周的工作时间)。 所以如果你有足够大的代码基础值得付出努力,这种方法是有意义的。