我是我公司的单元测试工作的先驱,需要选择一个模拟框架来使用.我之前从未使用过模拟框架.我们已经选择了Google Test,因此使用Google Mock会很不错.但是,在查看Google Mock的教程后,我的初步印象是:
我对Google的开发人员充满信心,对自己判断模拟框架的能力缺乏信心,以前从未使用过它们.所以我的问题是:这些有效的问题是什么?
或者没有更好的方法来定义模拟对象,并且在实践中直观地使用匹配器吗?我很感激之前使用过Google Mock的人的答案,并且与其他C++框架的比较会很有帮助.
我有一个返回智能指针的工厂.无论我使用什么智能指针,我都无法让Google Mock嘲笑工厂方法.
模拟对象是纯抽象接口的实现,其中所有方法都是虚拟的.我有一个原型:
MOCK_METHOD0(Create, std::unique_ptr<IMyObjectThing>());
Run Code Online (Sandbox Code Playgroud)
我得到:
"...gmock/gmock-spec-builders.h(1314): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'"
Run Code Online (Sandbox Code Playgroud)
定义了智能指针中指向的类型.
我得到它试图访问一个声明私有的构造函数,但我不明白为什么.当这是一个std :: auto_ptr时,错误说没有复制构造函数,这让我很困惑.
无论如何,有没有办法模拟一个返回智能指针的方法?或者有更好的方法来建造工厂吗?我唯一的决心是返回一个原始指针(blech ......)?
我的环境是Visual Studio 2010 Ultimate和Windows 7.我没有使用CLI.
在使用它来指定默认操作时,我不明白ON_CALL和EXPECT_CALL之间的区别.
到目前为止,我注意到/了解到有两种方法可以调整模拟的默认操作:
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));
Run Code Online (Sandbox Code Playgroud)
要么
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释一下:
我想了解的目的google-mock,谷歌的C++嘲讽框架.
我gtest早些时候已经合作过,但我仍然无法理解它是什么gmock.我们为什么需要它?
gtest用于单元测试.我们需要什么样gmock的话,如果gmock需要unit testing?
我对 gtest/gmock 进行了很多研究,但没有一个给我正确的答案。我是 C++ 新手,所以任何帮助都将不胜感激。
我使用GoogleMock/GoogleTest进行测试,当匹配器将模拟器的shared_ptr作为参数时,我会看到一些奇怪的行为,并且在同一个shared_ptr上调用EXPECT.令人讨厌的代码:
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
using namespace boost;
using namespace testing;
struct MyParameter
{
virtual ~MyParameter() {}
virtual void myMethod() = 0;
};
struct MyParameterMock : public MyParameter
{
MOCK_METHOD0(myMethod, void());
};
struct MyClass
{
virtual ~MyClass() {}
virtual void myMethod(shared_ptr<MyParameter> p) {}
};
struct MyClassMock : public MyClass
{
MOCK_METHOD1(myMethod, void(shared_ptr<MyParameter>));
};
TEST(LeakTest, GoogleMockLeaksMatchedPointer)
{
shared_ptr<MyClassMock> c = make_shared<MyClassMock>();
shared_ptr<MyParameterMock> p = make_shared<MyParameterMock>();
{
InSequence dummy;
EXPECT_CALL(*c, myMethod(Eq(p)));
EXPECT_CALL(*p, myMethod());
}
c->myMethod(p);
p->myMethod();
}
Run Code Online (Sandbox Code Playgroud)
当这个测试运行时,我明白了 …
我想测试一些失败的情况下,使用谷歌模拟不会在模拟对象上调用任何方法.所以代码是这样的:
auto mocObj = new MockObj;
EXPECT_NO_METHOD_CALL(mocObj); //this is what I'm locking for
auto mainObj = new MainObj(mocObj , ......and other mocks); // here I simulate a fail using the other mock objects, and I want to be sure the no methods are called on the mockObj
Run Code Online (Sandbox Code Playgroud) 我是一个相当新的软件开发人员,目前正在为几年前开始的现有C++项目添加单元测试.由于非技术原因,我不允许修改任何现有代码.我所有模块的基类都有一堆设置/获取数据和与其他模块通信的方法.
由于我只想对每个单独的模块进行单元测试,因此我希望能够为所有模块间通信方法使用预设值.即一个方法Ping(),它检查另一个模块是否处于活动状态,我希望根据我正在进行的测试类型返回true或false.我一直在研究Google Test和Google Mock,它确实支持模拟非虚拟方法.但是,所描述的方法(http://code.google.com/p/googlemock/wiki/CookBook#Mocking_Nonvirtual_Methods)要求我"模板化"原始方法以接受真实或模拟对象.由于前面提到的要求,我无法去基类中模拟我的方法,所以我需要一些其他方法来模拟这些虚方法
基本上,我想要模拟的方法是在一些基类中,我想要单元测试的模块和创建模块的是该基类的派生类.我的基本Module类和我想测试的模块之间有中间模块.
我很感激任何建议!
谢谢,
JW
编辑:一个更具体的例子
我的基类是rootModule,我要测试的模块是leafModule.有一个继承自rootModule的中间模块,leafModule继承自这个中间模块.
在我的leafModule中,我想测试doStuff()方法,该方法调用rootModule类中定义的非虚拟GetStatus(moduleName).我需要以某种方式使GetStatus()返回一个选定的固定值.模拟对我来说是新的,所以使用模拟对象甚至是正确的方法?
我试图模仿一个模板化的方法.
这是包含模拟方法的类:
class myClass
{
public:
virtual ~myClass() {}
template<typename T>
void myMethod(T param);
}
Run Code Online (Sandbox Code Playgroud)
如何使用Google Mock模拟myMethod方法?
我有一个模拟对象设置,如下所示:
MyObject obj;
EXPECT_CALL(obj, myFunction(_))
.WillOnce(Return(1))
.WillOnce(Return(1))
.WillOnce(Return(1))
.WillRepeatedly(Return(-1));
Run Code Online (Sandbox Code Playgroud)
有没有办法不必重复.WillOnce(Return(1))三次?
googlemock ×10
c++ ×9
googletest ×4
mocking ×3
unit-testing ×2
boost ×1
shared-ptr ×1
tdd ×1
templates ×1