GTest и GoogleMock EXPECT_CALL не работают в Windows, передаются на Mac с параметром char *
У меня есть тест в проекте, который я унаследовал, который похож на это
std::string value("test string");
const char * buffer = value.c_str();
EXPECT_CALL(object, foo(_,_,buffer, buffer.size(), _)).WillOnce(Return(0));
bar(value);
Буфер представляет собой символ *, указывающий на строку данных. Я вставил фиктивные значения, такие как object, чтобы сосредоточиться на проблеме, которая, кажется, заключается в использовании EXPECT_CALL. Сразу после этого EXPECT_CALL вызывается панель методов, которая принимает исходное строковое значение в качестве параметра, а затем внутри метода вызывает foo с буфером, созданным из исходного строкового значения.
Этот тест работает на сборке Mac этого проекта, но не на версии Windows. Кажется, что сравниваются адреса указателей для двух указателей символов - ожидаемого и фактического, а затем происходит сбой, потому что они разные. Метод foo определенно вызывается в баре.
Если этот метод теста (EXPECT_CALL) сравнивает адреса указателей, а не данные по этому указателю, то разве тест не должен пройти и на Mac?
Кто-нибудь знаком с четкой разницей между Mac и Windows при использовании EXPECT_CALL и указателей?
Я вижу ошибку
unknown file: error:
Unexpected mock function call - returning default value.
Function call: foo(NULL, 1, 0000000001CAAE78 pointing to "test string", 11,_)
Returns: 0
Google Mock tried the following 1 expectation, but it didn't match:
test.cpp(235): EXPECT_CALL(object, foo(_,_,buffer,buffer.size(),_)...
Expected arg #2: is equal to 0000000001CAAF78 pointing to "test string"
Actual: 0000000001CAAE78 pointing to "test string"
Expected: to be called once
Actual: never called - unsatisfied and active
test.cpp(235): error: Actual function call count doesn't match EXPECT_CALL(object, foo(_,_,buffer, buffer.size(), _)...
Expected: to be called once
Я изменил эту ошибку, чтобы отразить мой пример.
Спасибо заранее за вашу помощь.
2 ответа
Кажется, что нет никаких очевидных различий между Mac и Windows относительно EXPECT_CALL. Я полагаю, что также могут быть различия между string
реализация, и как компиляторы обрабатывают константные строки, которые могут объяснить разницу в поведении.
Однако я ожидаю, что аргументы указателя будут сопоставлены при сравнении адресов. Чтобы сравнивать значения, вы должны использовать определенные Matchers. В частности, для вашего случая на выбор предлагаются различные устройства сравнения строк, в том числе StrEq
для равенства строк, которое вы можете использовать как:
EXPECT_CALL(object, foo(_,_,testing::StrEq(buffer),value.size(),_))
.WillOnce(Return(0));
Причина, по которой это работает в Windows, заключается в том, что MSVC реализует пул строк (/GF
). Посмотреть здесь:
http://msdn.microsoft.com/en-us/library/s0s0asdt.aspx
Так почему же это работает? Поскольку gmock сравнивает адреса указателей, и когда у вас есть 2 одинаковые строки констант, объединение строк приведет к тому, что они будут иметь одинаковое значение. Отключите эту опцию компилятора и посмотрите, как она провалится