【问题标题】:How to Mock the return object如何模拟返回对象
【发布时间】:2020-01-30 09:46:16
【问题描述】:

我尝试模拟一个 User 类及其嵌套结构 UserBuilder:

class User
{
  public:
        virtual int loadData(const std::string& filename);
        virtual UserBuilder getUserBuilder(const std::string& functionName) const;

        struct UserBuilder
       {
        UserBuilder(std::string functionName) : m_functionName{functionName} {};
        virtual ~UserBuilder();
        virtual UserBuilder& fun1();
        virtual UserBuilder& fun2(int32_t num);
        virtual bool callFunction();
       private:
        std::string m_functionName{};
      };
}

这是用户的模拟类:

class UserMock : public User
{
public:
    MOCK_METHOD1(loadData, int(const std::string& filename));
    MOCK_CONST_METHOD1(getUserBuilder, UserBuilder(const std::string& functionName));
};

Thsi 是 UserBuilder 的模拟类:

struct UserBuilderMock : public User::UserBuilder
{
public:
    UserBuilderMock(std::string functionName) : User::UserBuilder(functionName) {}
    MOCK_METHOD0(fun1, UserBuilder&());
    MOCK_METHOD1(fun2, UserBuilder&(int32_t num));
    MOCK_METHOD0(callFunction, bool());
};

我想测试一下这个功能:

void useCase(std::unique_ptr<User> userP)
{   
    int status = userP->loadFile("init");
    if (status == 0)
    {
        User::UserBuilder builder = userP->getUserlBuilder("init");
        bool result = builder.fun1().fun2(1).callFunction();
        return result;
    }
    else
    {
        return false;
    }
}

我给 getUserBuilder("init") 一个模拟对象 builderMock 作为它的返回值,像这样:

auto userMock = std::make_unique<UserMock>();
ON_CALL(*userMock, loadFile("init")).WillByDefault(Return(0));
UserBuilderMock builderMock("init");
EXPECT_CALL(*userMock, getUserBuilder("init")).WillOnce(ReturnPointee(&builderMock));
EXPECT_CALL(builderMock,fun1()).Times(1);

测试日志失败:fun1 never called-unsatisfied and active。 我想用builderMock对象来调用mock方法fun1、fun2和callFunction,但是还是用了真正的UserBuilder对象 调用真正的 fun1、fun2 和 callFunction。我应该怎么做才能让它使用 Mock 对象调用 Mock 方法?

【问题讨论】:

  • virtual UserBuilder getUserBuilder(const std::string&amp; functionName) const; 没有返回指针
  • 如果我将该返回值更改为: virtual std:unique_ptr ,我应该如何给 MOCK 方法 getUserBuilder() 返回值,我尝试 Return(ByRef(builderMockP), builderMockP is a unique_ptr ,它不起作用

标签: c++ unit-testing googletest googlemock


【解决方案1】:

您必须重写代码以使 User::getUserBuilder 返回一个指向 UserBuilder 的指针(可能是智能指针)。

使用返回 UserBuilder 对象的方法

EXPECT_CALL(*userMock, getUserBuilder("init")).WillOnce(ReturnPointee(&builderMock));

getUserBuilder 将模拟转换为其基类的对象(切片),丢失所有模拟添加。

【讨论】:

  • 感谢您的回答。如果我们不能改变 User::getUserBuilder 返回类型,你认为有什么方法可以测试 fun1、fun2 和 callFunction。
  • User/UserBuilder 是否来自某个您无法更改的库?
  • 是的,它来自一个库,我不容易改变它。
  • 如果我更改虚拟 UserBuilder getUserBuilder(const std::string& functionName) const;到虚拟 std::unique_ptr<:userbuilder> getUserBuilder(const std::string& functionName) const;你觉得我应该给mock方法getUserBuilder()的返回值是多少,还是ReturnPointee(&builderMock)?
  • 只返回 std::unique_ptr<:userbuilder>。使用 unque_ptr 分配模拟对象,然后 Return(ByMove(uniquePointerToMock))
猜你喜欢
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 2011-02-10
相关资源
最近更新 更多