如何在生产中避免vtable查找,并且仍然能够在单元测试中进行广泛的模拟
How to avoid vtable-lookups in production, and still be able to mock extensively in unit-tests?
在C#这样的语言中,我经常让我的类依赖于接口而不是具体的类,即使只有一个"真正的"实现。这是为了使单元测试更容易(通过创建mock(。
当用C++编程时,我希望获得最大的性能,并且仍然使用TDD和mocking。有没有办法同时实现这两个目标?也就是说,能够在测试时进行模拟,并且在生产代码中仍然有直接的具体调用?
如何在C++中实现这一点?
因此,代替接口和运行时多态性:
struct IService
{
virtual ~IService() = 0;
virtual void foo() = 0;
// ...
};
class C
{
public:
explicit C(IService& service) : service(service) {}
void DoJob() { /*..*/ service.foo(); /*..*/ }
// ..
private:
IService& service;
};
生产中:
struct Service : IService
{
void foo() override;
// ...
};
Service service;
C c(service);
c.doJob();
测试中
struct ServiceMock : IService
{
void foo() override;
// ...
};
ServiceMock service;
C c(service);
c.doJob();
您可以使用模板:
// No interface to provide requirement, so document it
// TService must have `foo()`, ...
// or wait for C++20 concept
template <typename TService>
class C
{
public:
explicit C(TService& service) : service(service) {}
void DoJob() { /*..*/ service.foo(); /*..*/ }
// ..
private:
TService& service;
};
调用代码主要类似于运行时代码:-没有继承权。-不过在C++17之前更详细。:/
生产中:
struct Service
{
void foo();
// ...
};
Service service;
C c(service); // or before C++17 C<Service> c(service);
c.doJob();
测试中:
struct ServiceMock
{
void foo();
// ...
};
ServiceMock service;
C c(service); // or before C++17 C<ServiceMock> c(service);
c.doJob();
但这种模板与const
一样具有传染性(调用可测试代码也应该是模板(。
在C++17之前,它似乎真的太冗长了:
OuterService<ServiceA<Service1, Service2>, ServiceB<Service1, Service2>> outer(serviceA, servceB);
// versus
// OuterService outer(serviceA, servceB);
相关文章:
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 用于交叉编译和CMake的预处理器宏的单元测试
- C++ 用于单元测试的模板模板
- 提升 1.64 单元测试编译失败
- 在类 gtest/gmock 进行单元测试时模拟成员函数C++
- 如何在生产中避免vtable查找,并且仍然能够在单元测试中进行广泛的模拟
- C++ 谷歌模拟/单元测试:模拟方法未调用,原始方法是
- 在为函数编写单元测试时,我应该模拟所做的内部函数调用吗?
- 如何使用gmock框架模拟c++单元测试中的fork和execlp系统调用
- 编译器错误,用静态多主体主义模拟C++单元测试
- 使用c++分层命名空间解析为单元测试提供模拟组件是一种好做法吗?< / h1 >
- 谷歌模拟单元测试
- 如何使用google test在单元测试中模拟不同的时区
- 如何在没有模拟框架的情况下对具有严重依赖关系的类进行单元测试?
- 单元测试-模拟C++标准库
- 单元测试——不直接使用被模拟对象的Google Mock (c++)
- 单元测试-我试图用googlemock模拟一个简单的c++方法有什么问题?
- 单元测试-如何模拟c++中使用RAII的类