C++模拟框架,能够模拟非虚方法和C函数

bru*_*ery 4 c++ linux gcc unit-testing mocking

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

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()); 
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*bel 5

GMock支持他们所谓的hi-perf依赖注入来模拟非虚方法.

从上面的链接,要点是使用模板:

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

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

然后,您可以在生产代码中使用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
Run Code Online (Sandbox Code Playgroud)

测试代码使用模拟全局函数,而不是直接使用全局函数.您可以在T(for Test)命名空间中访问模拟函数,因此测试的代码调用T :: time()而不是time().这相当于使用抽象接口而不是具体类.

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

int generateRandomNumber()
{
    return T::time( NULL ) * 3;
}
Run Code Online (Sandbox Code Playgroud)

我过去对Cxxtest方法运气不错.