首页 > 解决方案 > Gmock - 严格的模拟和独特的 ptr - 如何将模拟传递给 impl

问题描述

这是一个示例代码:

class Interface
{
public:
    virtual ~Interface(){}
    virtual void Start() = 0;
};

class MockInterface: public Interface
{
public:
    MOCK_METHOD0(Start, void());
};

class T
{
public:
    T(std::unique_ptr<Interface>& impl): impl_(impl){}
private:
    std::unique_ptr<Interface>& impl_;
};

我想创建一个严格的模拟,但我不确定如何将它构造为唯一的 ptr 然后传递给 T 构造函数。

标签: c++11googletestgmock

解决方案


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

class Interface
{
public:
    virtual ~Interface(){};
    virtual void Start() = 0;
};

class MockInterface : public Interface
{
public:
    MOCK_METHOD0( Start, void() );
};

class T
{
public:
    explicit T( std::unique_ptr< Interface > impl ) :
        impl_( std::move( impl ) ) {}
    void Start()
    {
        impl_->Start();
    }

private:
    std::unique_ptr< Interface > impl_;
};

TEST( Interface_test, Interface )
{
    auto mock{ std::make_unique< MockInterface >() };
    EXPECT_CALL( *mock, Start() );

    auto t{ T{ std::move( mock ) } };

    t.Start();
}

发布完整的答案以及使用示例和 T 类的更新。建议移动 unique_ptr 而不是参考。


推荐阅读