gtest ожидаемые аргументы в макетном методе

#googletest #googlemock #gmock

Вопрос:

Я высмеял функцию, которая принимает std::set (stl) в качестве аргумента, и я ожидал, что она будет вызвана с правильными аргументами. std::set является набором определяемой пользователем структуры, и я просто хочу проверить, что одно поле этой структуры имеет одно значение для всех членов set. ie

   struct my_struct {
    int i;
    int j;
    int k;
}   
using my_set = std::set<my_struct>;
MOCK_METHOD(void, my_func, (my_set));

EXPECT_CALL(obj, my_func(_))
    .Times(1);
 
 

Теперь я хочу ожидать, что my_func будет вызван с помощью my_set, и каждый член my_set-это my_struct и my_struct.я должен быть 1 для всех членов.

Я понимаю, что это можно было бы сделать с помощью Matcher и каждого, но теперь я уверен, как это сделать, так как я столкнулся с ошибкой компиляции

Ответ №1:

Ключ в том, чтобы использовать ::testing::Each сопоставление с ::testing::Field сопоставлением в сочетании. Each выполняет итерацию по всем элементам аргумента контейнера, а Field сопоставитель позволяет задать правильные ожидания для определяемых пользователем struct полей. Полный пример:

 struct my_struct {
    int i;
    int j;
    int k;
};

auto my_set_comp = [](const autoamp; l, const autoamp; r) { return std::tie(l.i, l.j, l.k) < std::tie(r.i, r.j, r.k); };
using my_set = std::set<my_struct, decltype(my_set_comp)>;

class MockClass {
public:
    MOCK_METHOD(void, my_func, (my_set));
};

TEST(SetTest, test1) {
    MockClass obj{};

    my_set a_set{my_set_comp};
    a_set.emplace(my_struct{1, 1, 1});
    a_set.emplace(my_struct{1, 2, 2});
    a_set.emplace(my_struct{1, 3, 3});

    EXPECT_CALL(obj, my_func(::testing::Each(::testing::Field(amp;my_struct::i, 1)))).Times(1);

    obj.my_func(a_set);
}
 

или здесь.