我试图模拟这样的功能:
int write(int fd, const void* buffer, size_t size, bool something)
我想检查缓冲区传递的数据的正确性(第一个和最后一个参数对于测试并不重要)。
有几个很好的匹配器可以帮助我们做到这一点,即 ElementsAreArray。如果指针是例如char*
,那么就很简单了:
EXPECT_CALL(myMock, write(_, NotNull(), expectedSize, _)
.With(Args<1,2>(ElementsAreArray(dummyArray));
问题:void* 无法取消引用。因此,它无法与 ElementsAreArray 匹配。
我尝试了以下方法:
EXPECT_CALL(myMock, write(_, NotNull(), expectedSize, _)
.With(Args<1,2>(MatcherCast<::testing::tuple<const char*, size_t>>(ElementsAreArray(dummyArray)));
但它在 MatcherCast 中失败了 static_assert -T_must_be_implicitly_convertible_to_U
可以编写自己的匹配器来避免这种情况,但感觉很笨拙。下面的方法有效,但我更喜欢避免编写自己的匹配器:
MATCHER_P2(EqualToArray, compareArray, n, "")
{
const char *arr = static_cast<const char*>(arg);
for (size_t i = 0; i < n; ++i)
{
if (arr[i] != compareArray[i])
{
return false;
}
}
return true;
}
EXPECT_CALL(myMock, write(_, EqualToArray(dummyArray, expectedSize), expectedSize, _);
EDIT:抱歉,我可能没说清楚。
我知道从 void* 转换为任何其他指针类型并不是什么大问题。但这要求我们有一个函数或用户定义的匹配器,例如像我写的那样,并且如果可以使用已经定义的 GMock 匹配器,我会尽量避免使用用户定义的匹配器。
所以,更具体的问题是:
是否可以投 void*
to a char*
within EXPECT_CALL
macro?
或者换句话说:
是否可以使以下代码片段在不改变的情况下工作 ElementsAreArray()
到用户定义的匹配器:
EXPECT_CALL(myMock, write(_, NotNull(), expectedSize, _)
.With(Args<1,2>(ElementsAreArray(dummyArray));