gtest/gmock 简单实例返回值为自定义类型

 

帖子:gtest/gmock 简单实例 给出了返回值为内置类型的例子,在实际项目中经常出现返回值为自定义类型的数据对象,当被测试函数的返回值为自定义类型时,如何mock?

简单的例子:

main函数所

// GoogleTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "Bar.h"
#include "MockFoo.h"
#include "BarTest.h"


int main(int argc, char* argv[])
{
    testing::GTEST_FLAG(output) = "xml:./Report/";
    testing::InitGoogleTest(&argc, argv);
    
    RUN_ALL_TESTS();
    return 0;
}

 Foo.h文件,定义自定义返回类型,并重载==运算符

#pragma once
class ResultData
{
    friend bool operator==(const ResultData& lhs, const ResultData& rhs);
public:
    void SetDataValue(int val) { m_data = val; }
private:
    int m_data = 100;

    bool operator==(ResultData& rhs) {
        return this->m_data == rhs.m_data;
    }
};

class Foo {
public:
    virtual int count() = 0;
    virtual ResultData GetResultData() = 0;
};

bool operator==(const ResultData& lhs, const ResultData& rhs)
{
    return lhs.m_data == rhs.m_data;
}

文件Bar.h增加返回类型为自定类型对象的待测试函数 

#pragma once

#include "Foo.h"

class Bar {
public:
    Bar(Foo *foo) : m_foo(foo) {
    }

    int count() {
        return m_foo->count();
    }

    ResultData GetResultData()
    {
        return m_foo->GetResultData();
    }

private:
    Foo *m_foo;
};

文件 MockFoo.h编写mock

#pragma once

#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "Foo.h"

class MockFoo : public Foo {
public:
    MOCK_METHOD0(count, int());
    MOCK_METHOD0(GetResultData, ResultData());
};

文件BarTest.h

#pragma once
#include <gtest/gtest.h>
#include "bar.h"
#include "MockFoo.h"
//定义测试类Bar的固件类BarTest
class BarTest : public::testing::Test
{
protected:
    Bar* m_TestImpl;
    MockFoo *mockFoo;
    void SetUp() override
    {
        mockFoo = new MockFoo();
        m_TestImpl = new Bar(mockFoo);
    }
    void TearDown() override
    {
        if (m_TestImpl)
        {
            delete m_TestImpl;
            m_TestImpl = nullptr;
        }
    }
};

TEST_F(BarTest, count)
{
    EXPECT_CALL(*mockFoo, count())
        .Times(3)
        .WillOnce(testing::Return(3))
        .WillOnce(testing::Return(6))
        .WillOnce(testing::Return(5));

    EXPECT_EQ(m_TestImpl->count(), 3);
    EXPECT_EQ(m_TestImpl->count(), 6);
    EXPECT_EQ(m_TestImpl->count(), 5);
}

TEST_F(BarTest, GetResultData)
{
    ResultData rd;
    rd.SetDataValue(100);
    ResultData rd_exp;
    rd_exp.SetDataValue(100);

    EXPECT_CALL(*mockFoo, GetResultData()).Times(1).WillOnce(testing::Return(rd));
    EXPECT_EQ(m_TestImpl->GetResultData(), rd_exp);
}

参考

  1. test fixture
  2. 使用gtest的测试学习

  3. 玩转Google单元测试框架gtest系列之六:运行参数

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值