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)
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方法运气不错.
| 归档时间: |
|
| 查看次数: |
1613 次 |
| 最近记录: |