#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);
}
или здесь.