Я получил следующий тест, чтобы сделать то, что я хочу.
MOCK_METHOD2(write, void(unsigned char*, int));
unsigned char bar[] = {1,2,3};
EXPECT_CALL(foo, write(_, sizeof(bar))).With((ElementsAreArray(bar)));
Но если я изменю тип параметра на void * для функции, как показано ниже, она не будет компилироваться.
MOCK_METHOD2(write, void(void*, int));
С ошибкой:
error C2182: 'abstract declarator' : illegal use of type 'void'
gmock-matchers.h(2536) : see reference to class template instantiation 'testing::internal::ElementsAreMatcherImpl<Container>' being compiled
with
[
Container=const std::tuple<void *,unsigned char>
]
Это имеет смысл, я думаю, но я не могу найти способ решить это, где аргумент - это пустота *, которая должна быть здесь. Есть ли возможность решить это?
ElementsAreArray
необходимо разыменовать указатель аргументов, чтобы сравнить его, и указатели void*
не могут быть разыменованы. Вам нужно будет memcmp
к пользовательскому совпадению для сравнения буферов, переданных как void*
:
MATCHER_P2(HasBytes, bytes, size, "") {
return arg1 == size && memcmp(arg0, bytes, size) == 0;
}
EXPECT_CALL(foo, write(_, sizeof(bar))).With(Args<0, 1>(HasBytes(bar, sizeof bar)));
Неправильное использование контейнера контейнера ElementsAreArray
с помощью void*
Попробуйте найти правильный матчи для void*
отсюда