微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为模板专业化方法创建 gmock 测试

如何解决为模板专业化方法创建 gmock 测试

我想添加 GMOCK 测试来验证容器是否访问了正确的方法。 对于vector,它应该访问第二种方法,对于set,它应该访问第一种方法(因为setset.find)。 这是我的模板专业:

namespace tools{

struct low_priority {};
struct high_priority : low_priority {};

template<class TSource,class Ty>
auto exists_in(high_priority,const TSource &source,const Ty &item)
-> decltype(source->find(item) != source.end())
{
    return source.find(item) != source.end();
}

template<class TSource,class Ty>
auto exists_in(low_priority,const Ty &item)
{
    return std::find(source.begin(),source.end(),item) != source.end();
}


template<class TSource,class Ty>
auto exists_in(const TSource &source,const Ty &item)
{
    return exists_in(high_priority{},source,item);
}
}

解决方法

您不能使用来自自由函数或模板方法的模拟。

在这种情况下您可以做的是创建一个自定义结构并检查是否调用了 operator<(对于 std::set::find)或 operator==(对于 std::find)。>

或者,您可以为 std::set 创建模拟类型并检查 find 方法是否被调用。

,

我以另一种方式为向量做了这个,但它不起作用,我如何正确检查该方法是否被调用?

struct Interface
{
    virtual ~Interface() = default;
    virtual bool exists_in(std::vector<int>,int) = 0;
};

struct Implementation : Interface
{
    bool exists_in(std::vector<int> v,int i) override { tools::exists_in(v,i); }
};

class MockClass : public Interface {
public:
    MOCK_METHOD(bool,exists_in,(std::vector<int>,int));
};

**ADDED NEW**
TYPED_TEST_SUITE_P(ExistsInTestMethod);

TYPED_TEST_P(ExistsInTestMethod,ExistsInMethod)
{
    TypeParam Container = InitVectorContainer<TypeParam>();

    MockClass mock;
    EXPECT_CALL(mock,exists_in(Container,5));
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。