- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在为现有代码库编写单元测试。我们使用 Google Test/Google Mock 进行测试,C++11 和 Eclipse CDT 与 gcc 编译器。
我们的一个类聚合了一个 Boost 套接字。它使用它作为一个实例,但幸运的是我们可以修改现有的代码库,我将它更改为一个指针并将套接字作为依赖项注入(inject)。所以我开始模拟对套接字的调用,但有一个问题:Boost 函数是非虚拟的。
我找到了说明如何使用 模拟非虚函数的文档 hi-perf dependency injection 。但是,尝试如图所示实现它,但没有成功。例如,文档说“将您的代码模板化”。因此,对于我们使用升压 socket 的类(class),我以他们为榜样。我插入:
template <class boost::asio::ip::udp::socket>
这应该让我们插入模拟类而不是具体的 Boost 类。我在类之前尝试过它,并且在接受套接字的构造函数之前分别在头文件和实现文件中尝试过。在每个地方,我都会遇到大量错误,其中大部分都与构造函数调用“没有匹配的函数调用”有关。
很明显,我做错了什么。有谁知道某处的完整示例吗?
更新:根据要求,这是我们目前拥有的:
GoogleMock 模拟非虚函数
class PIngester : public IPIngester{
public:
// this is the method that takes the socket. It is the constructor, and the socket
// is a default parameter so the existing code will still work. We added the socket
// as a parameter specifically for unit testing. If no socket is provided, the
// constructor creates one. It only will ever create a concrete Boost
// Socket, not a mock one.
PIngester(boost::asio::io_service& ioService, Band band,
std::unique_ptr<boost::asio::ip::udp::socket> socket = std::unique_ptr<boost::asio::ip::udp::socket>(nullptr));
...
更新 2
我为模板定义了一个通用类类型,但这会破坏现有代码。这是我当前的版本:
class PIngester : public IPIngester{
public:
template <class Socket>
PIngester(boost::asio::io_service& ioService, Band band,
std::unique_ptr<Socket> socket = std::unique_ptr<Socket>(nullptr));
...
我认为它可能会吐出默认参数,但我不能确定。错误消息不是很有用:
error: no matching function for call to ‘foonamespace::PIngester::PIngester(boost::asio::io_service&, foonamespace::Band&)’
new PIngester(ioService, band));
此错误消息来自现有代码;它似乎无法识别默认参数。
更新 3
我已经放弃了这种方法,并决定改为编写一个 Boost 套接字包装器。包装器将保存实际的 Socket 实例,其方法将直接传递给实际的 Socket。包装器的函数将是虚拟的,我的模拟对象将从包装器继承。然后我的模拟对象将模拟包装器的虚函数。
最佳答案
正如您所注意到的,问题是编译器无法推断出任何类型 Socket
意思是在这里表示:
class PIngester : public IPIngester{
public:
template <class Socket>
PIngester(boost::asio::io_service& ioService, Band band,
std::unique_ptr<Socket> socket = std::unique_ptr<Socket>(nullptr));
...
如果您尝试在不指定第三个参数的情况下构造此类的对象(如在 new PIngester(ioService, band)
中),那么 Socket
会怎样?究竟是?
现在,在调用构造函数时无法显式指定任何模板参数,因此您不能执行类似new PIngester<boost::asio::ip::udp::socket>(ioService, band)
的操作。如果构造函数是模板化的。
这里有几种方法(可能有很多)来解决这个问题:
您可以将 PIngester
模板化类本身:
template <class Socket>
class PIngester : public IPIngester{
public:
PIngester(boost::asio::io_service& ioService, Band band,
std::unique_ptr<Socket> socket = std::unique_ptr<Socket>(nullptr));
...
然后调用new PIngester<boost::asio::ip::udp::socket>(ioService, band)
(或您的模拟类(class)代替 boost::asio::ip::udp::socket
)会起作用。
您可以定义一个默认模板参数:
class PIngester : public IPIngester{
public:
template <class Socket = boost::asio::ip::udp::socket>
PIngester(boost::asio::io_service& ioService, Band band,
std::unique_ptr<Socket> socket = std::unique_ptr<Socket>(nullptr));
...
然后PIngester(ioService, band)
将始终使用此默认的 Boost 类,并且您需要显式传递一些 socket
如果您想在测试中使用它,它表示指向您的模拟类的唯一指针。
关于c++ - GoogleMock 模拟非虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51408164/
与其说是一个问题,不如说是一个知识共享。 根据 GoogleMock FAQ无法模拟可变参数函数,因为不知道该函数将提供多少参数。 这是真的,但在大多数情况下,人们知道从被测系统调用可变参数函数有多少
我如何模拟一个返回新对象的方法,该对象的构造函数将方法的参数之一作为其自身的参数? // ObjectA::ObjectA(MockedObject arg1, ObjectB* arg2); //
我有一个模拟这样的方法: MOCK_METHOD2(setValue, int(int notImportant, unsigned int value)); MOCK_METHOD2(getValu
我有一个模拟这样的方法: MOCK_METHOD2(setValue, int(int notImportant, unsigned int value)); MOCK_METHOD2(getValu
我想使用 GoogleMock 模拟如下服务: class Request { int req_id; int request; }; class Response { int
我们正在为现有代码库编写单元测试。我们使用 Google Test/Google Mock 进行测试,C++11 和 Eclipse CDT 与 gcc 编译器。 我们的一个类聚合了一个 Boost
我在运行 make 时不断收到这些错误: debug/main.o: In function `MockMQAdapter::MockMQAdapter()': /source/Tests/tests
#include "gtest/gtest.h" #include "gmock/gmock.h" class Turtle{ public: int foo(); }; i
我是 google mock 的初学者,我不确定如何使用它和概念。 如果我试图测试一个类中的方法,而这个类正在调用不同类中的一些其他方法。我是否需要从我的测试方法调用的不同类中模拟所有这些方法。这是一
看起来我在尝试模拟接口(interface)时无法使用虚拟继承。我需要使用虚拟继承,因为我的代码依赖于第三方库。第 3 方库使用虚拟继承通过父级从一个子级转换为另一个。我们需要能够根据 3rd 方库的
我有一个 Foo 类,它引用多个其他 IBar 类型的对象。该类有一个方法 fun,它需要至少在其中一个 IBar 上调用方法 frob。我想用模拟的 IBar 编写一个测试来验证这个要求。我正在使用
我开始使用 googletest 和 googlemock 库,但遇到无法解决的问题。我有这样的代码: class Painter { public: void DrawSomething()
我在工作中使用 googlemock。我们经常使用 EXPECT_THROW、EXPECT_NO_THROW 等... 我的问题是,当一个函数被包装在 EXPECT_NO_THROW 中但实际上抛出异
我想模拟一个返回复杂数据类型的方法 class aClass { public: virtual const QMap aMethod() const; } class MockaClass :
我尝试模拟表示 NVRAM 的现有类的行为和 API。 API 是: bool Init(Uint8* dataPointer); bool Store(); //Writes the data fr
是否可以从同一类的其他方法调用中模拟方法调用?我是 C++ 的新手(主要是 C 开发人员)并且是 googlemock 和 Google Test 的新手所以如果在其他地方回答了这个问题并且我不明白答
我创建了一个 googlemock 文本夹具类,在 SetUp 中我使用 new 创建了两个对象。在拆解中,如果我什么都不删除,我只会得到其中一个对象的内存泄漏错误。 class MissileLau
我有一个小类: struct Command { uint8_t cmdId; uint8_t len; uint8_t payload[MAX_PAYLOAD]; }; 我只
我已经使用 gtest 一段时间了,但最近想尝试一下 gmock。我正在尝试使用返回值的方法模拟类,但也通过引用在输出参数中返回一些东西。这是我的小代码。 #include #include "gm
我正在测试我的类是否使用正确的参数调用模拟类上的方法。我已经建立了一个基本的期望: // mListener is a mocked object // This expectation accept
我是一名优秀的程序员,十分优秀!