I am using google mock to unit test my code, and I am trying to return, as an output argument, a set of values through a void*.
uint32_t bigEndianTestValues[BIG_ENDIAN_FIELD_MAX_ELEMENTS] = {0xDEADBEEF, 0xFFFF0000, 0x00000000, 0x00A00F10, 0x11234211};
for (int i = 0; i < BIG_ENDIAN_FIELD_MAX_ELEMENTS; ++i)
{
EXPECT_CALL( deviceWindow, get(_,sizeof(bigEndianTestValues[0]),_,_) )
.WillOnce(SetArgPointee<2>(bigEndianTestValues[i]))
.RetiresOnSaturation();
}
My mock contains a method call as follows
MOCK_METHOD4(get, void(const size_t, const size_t, void*, nNIAPALS100::tStatus&));
But I get the following error
....\include\gmock/gmock-actions.h(693) : error C2100: illegal indirection
....\gmock/gmock-actions.h(369) : see reference to function template instantiation 'void testing::internal::SetArgumentPointeeAction<N,A,kIsProto>::Perform<void,std::tr1::tuple<T0,T1,T2,T3>>(const ArgumentTuple &) const' being compiled with
[
N=0x02,
A=uint32_t,
kIsProto=false,
T0=size_t,
T1=size_t,
T2=void *,
T3=nNIAPALS100::tStatus &,
ArgumentTuple=std::tr1::tuple<size_t,size_t,void *,nNIAPALS100::tStatus &>
]
z:\Perforce\jperetzm_JPERETZM-DT\ThirdPartyExports\googlemock\export\1.6\1.6.0a0\includes\gmock\include\gmock/gmock-actions.h(368) : while compiling class template member function 'void testing::Polymor
phicAction<Impl>::MonomorphicImpl<F>::Perform(const std::tr1::tuple<T0,T1,T2,T3> &)'
with
[
Impl=testing::internal::SetArgumentPointeeAction<0x02,uint32_t,false>,
F=void (size_t,size_t,void *,nNIAPALS100::tStatus &),
T0=size_t,
T1=size_t,
T2=void *,
T3=nNIAPALS100::tStatus &
]
....\include\gmock/gmock-actions.h(356) : see reference to class template instantiation 'testing::PolymorphicAction<Impl>::MonomorphicImpl<F>' being compiled
with
[
Impl=testing::internal::SetArgumentPointeeAction<0x02,uint32_t,false>,
F=void (size_t,size_t,void *,nNIAPALS100::tStatus &)
]
....\StorageMapRaw_Test.cpp(471) : see reference to function template instantiation 'testing::PolymorphicAction<Impl>::operator testing::Action<F>(void) const<F>' being compiled with
[
Impl=testing::internal::SetArgumentPointeeAction<0x02,uint32_t,false>,
F=void (size_t,size_t,void *,nNIAPALS100::tStatus &)
]
....include\gmock/gmock-actions.h(693) : error C2440: '=' : cannot convert from 'const uint32_t' to 'void *const 'Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast storageMap_test_win64U_x64_msvc90_debug - 2 error(s), 0 warning(s)
It seems that I need to cast the void* to an uint32_t*. Any idea how to do it?
first, you use some simple macros to describe the interface you want to mock, and they will expand to the implementation of your mock class; next, you create some mock objects and specify its expectations and behavior using an intuitive syntax; then you exercise code that uses the mock objects.
EXPECT_CALL not only defines the behavior, but also sets an expectation that the method must be called with the given arguments, for the given number of times (and in the given order when you specify the order too).
Mock are like objects, defined in such a way to mimick the real-deal by supplying controlled behavior. For instance, to test a stock tick application, you'd create a fake stock data provider that created fake stock quotes to test your code with. Think of the word mock, literally means 'to mimic'.
SetArgPointee
and other standard actions are type-safe. They will not allow you to do such unsafe assignment. You have to write a custom action that will do the typecasting:
ACTION_P(SetArg2ToInt32, value) { *static_cast<uint32_t*>(arg2) = value; }
...
EXPECT_CALL(deviceWindow, get(_,sizeof(bigEndianTestValues[0]),_,_))
.WillOnce(SetArg2ToInt32(bigEndianTestValues[i]))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With