簡體   English   中英

為模板專業化方法創建 gmock 測試

[英]Create gmock tests for template specialization methods

我想添加 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 TSource &source, 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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM