- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
看起来我在尝试模拟接口(interface)时无法使用虚拟继承。我需要使用虚拟继承,因为我的代码依赖于第三方库。第 3 方库使用虚拟继承通过父级从一个子级转换为另一个。我们需要能够根据 3rd 方库的期望进行模拟,但事实并非如此。
注意:IA、IB、IC 和 ID 是第 3 方库
class IA
{
};
class IB :virtual public IA
{
};
class IC :virtual public IB
{
public:
int getValue(){}
};
class ID : virtual public IA
{
public:
void type(){};
};
class MockD :
public ID
//virtual public ID; fails all of my tests that depends on ID
{
public:
MOCK_METHOD0(type, void())
};
class MockC :
//virtual public IC, virtual public MockD{}; //throws an exception for accessing pD->type()
// public IC, virtual public MockD{}; //throws an exception for accessing pD->type()
//virtual public IC, public MockD{}; //throws an exception for accessing pC->getValue()
// public IC, public MockD{}; //throws an exception for accessing pD->type()
{
MOCK_METHOD0(getValue, void());
};
//throws an exception for accessing pD->type()
IA
_______
(v)/ \(v)
IB ID
(v)| |
IC MockD
| |
(v)\ /(v)
MockC
IA
_______
(v)/ \(v)
IB ID
(v)| |
IC MockD
| |
\ /(v)
MockC
IA
_______
(v)/ \(v)
IB ID
(v)| |
IC MockD
| |
\ /
MockC
//throws an exception for accessing pC->getValue()
IA
_______
(v)/ \(v)
IB ID
(v)| |
IC MockD
| |
(v)\ /
MockC
IA
待测代码
ID* pD = dynamic_cast<ID*>(pC);
pD->type();
pC->getValue();
//在测试中
MockC* mockC = new MockC();
EXPECT_CALL(mockC, type());
EXPECT_CALL(mockC, getValue());
最佳答案
您只需要从 ID
派生的 Mock 对象并模拟其所有功能。然后忘记 MockC
并以您需要的方式定义 MockD
:
class MockD : public ID
{
public:
MOCK_METHOD0(type, void());
MOCK_METHOD0(getValue, int());
};
并以这种方式设置您的测试期望:
MockD mockD;
EXPECT_CALL(mockD, type());
EXPECT_CALL(mockD, getValue()).WillOnce(Return(0)); //not sure you want zero - use return value that you needs
然后 - 假设这是 void codeUnderTest(IC& c)
- 您要测试的代码 - 只需将 mockD
传递给此代码:
codeUnderTest(mockD);
如果您出于某些其他原因同时需要 MockD
和 MockC
- 然后使用模板定义来实现此目标:
template <typename Interface>
class MockCT : public Interface
{
public:
MOCK_METHOD0(getValue, int());
};
using MockC = MockCT<IC>;
template <typename Interface>
class MockDT : public MockCT<Interface>
{
public:
MOCK_METHOD0(type, void());
};
using MockD = MockDT<ID>;
关于c++ - googlemock 框架不适用于虚拟继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45873062/
与其说是一个问题,不如说是一个知识共享。 根据 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
我是一名优秀的程序员,十分优秀!