标签: googlemock

Google Mock是一个很好的模拟框架吗?

我是我公司的单元测试工作的先驱,需要选择一个模拟框架来使用.我之前从未使用过模拟框架.我们已经选择了Google Test,因此使用Google Mock会很不错.但是,在查看Google Mock的教程后,我的初步印象是:

  • 需要使用MOCK_METHODn宏重新声明模拟类中的每个方法似乎是不必要的,并且似乎违反了DRY原则.
  • 他们的匹配器(例如,EXPECT_CALL中的'_'(乌龟,前进(_));)和匹配顺序似乎太强大了.比如,很容易说出你不想要的东西,并错过那种错误.

我对Google的开发人员充满信心,对自己判断模拟框架的能力缺乏信心,以前从未使用过它们.所以我的问题是:这些有效的问题是什么?

或者没有更好的方法来定义模拟对象,并且在实践中直观地使用匹配器吗?我很感激之前使用过Google Mock的人的答案,并且与其他C++框架的比较会很有帮助.

c++ mocking googlemock

62
推荐指数
4
解决办法
3万
查看次数

谷歌可以用智能指针返回类型模拟一个方法吗?

我有一个返回智能指针的工厂.无论我使用什么智能指针,我都无法让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.

c++ unit-testing smart-pointers googlemock

46
推荐指数
3
解决办法
2万
查看次数

gmock设置默认操作/ ON_CALL与EXPECT_CALL

在使用它来指定默认操作时,我不明白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)

有人可以向我解释一下:

  • 两种方法的区别
  • 每个人的起伏
  • 什么时候适合使用它们(什么样的设置...)

c++ googlemock

46
推荐指数
3
解决办法
6万
查看次数

gtest和gmock有什么区别?

我想了解的目的google-mock,谷歌的C++嘲讽框架.

gtest早些时候已经合作过,但我仍然无法理解它是什么gmock.我们为什么需要它?

gtest用于单元测试.我们需要什么样gmock的话,如果gmock需要unit testing

c++ googletest googlemock

33
推荐指数
4
解决办法
3万
查看次数

TEST、TEST_F 和 TEST_P 之间有什么区别?

我对 gtest/gmock 进行了很多研究,但没有一个给我正确的答案。我是 C++ 新手,所以任何帮助都将不胜感激。

googletest googlemock

29
推荐指数
2
解决办法
3万
查看次数

为什么GoogleMock泄露了我的shared_ptr?

我使用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)

当这个测试运行时,我明白了 …

c++ boost googletest shared-ptr googlemock

28
推荐指数
1
解决办法
2万
查看次数

谷歌模拟:我如何"预测"在模拟上不会调用任何方法

我想测试一些失败的情况下,使用谷歌模拟不会在模拟对象上调用任何方法.所以代码是这样的:

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++ googletest googlemock

27
推荐指数
3
解决办法
2万
查看次数

在不编辑生产代码的情况下用C++模拟非虚方法?

我是一个相当新的软件开发人员,目前正在为几年前开始的现有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()返回一个选定的固定值.模拟对我来说是新的,所以使用模拟对象甚至是正确的方法?

c++ unit-testing mocking googlemock

19
推荐指数
2
解决办法
6882
查看次数

如何使用Google Mock模拟模板化方法?

我试图模仿一个模板化的方法.

这是包含模拟方法的类:

class myClass
{
public:
    virtual ~myClass() {}

    template<typename T>
    void myMethod(T param);
}
Run Code Online (Sandbox Code Playgroud)

如何使用Google Mock模拟myMethod方法?

c++ templates mocking googlemock

18
推荐指数
1
解决办法
1万
查看次数

避免在Google Mock中多次匹配.WillOnce

我有一个模拟对象设置,如下所示:

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))三次?

c++ tdd googlemock

17
推荐指数
1
解决办法
2万
查看次数