【发布时间】:2018-02-13 14:58:40
【问题描述】:
我正在尝试模拟这样的功能:
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, _);
编辑:对不起,我可能没有说清楚。
我知道从 void* 转换为任何其他指针类型并不是什么大问题。但这需要我们有一个函数或用户定义的匹配器,例如我写的那个,如果可以使用已经定义的 GMock 匹配器,我会尽量避免使用用户定义的匹配器。
所以,更具体的问题是:
是否可以转换 void* 到一个 char* 在 @ 987654329@ 宏?
或者换句话说:
是否可以在不改变ElementsAreArray() 用户定义的匹配器的情况下使以下 sn-p 工作:
EXPECT_CALL(myMock, write(_, NotNull(), expectedSize, _)
.With(Args<1,2>(ElementsAreArray(dummyArray));
【问题讨论】:
-
const char * foo = static_cast<const char*>(buffer);是这样做的正确方法。