我将一个指向数组的指针传递给一个函数,我用googlemock模拟了这个函数。我想验证参数的内容,这对标量来说很好,但我无法获取数组的元素:
#include <iostream>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
class InterfaceTest : public ::testing::Test {};
class MockFortranFuncInterfacePointerArgs {
public:
MOCK_METHOD(void, fortran_interface_test_func_pointerargs, (int*, int*));
};
void testfunc_pointer(MockFortranFuncInterfacePointerArgs* func_interface) {
int testscalar = 123;
int testarray[3] = {1, 2, 3};
func_interface->fortran_interface_test_func_pointerargs(&testscalar, &testarray[0]);
}
TEST_F(InterfaceTest, TestFuncInterfacePointerArgs) {
MockFortranFuncInterfacePointerArgs mock_func_interface;
int passed_scalar = 0;
int passed_array[3] = {0, 0, 0};
// int passed_array = 0;
EXPECT_CALL(mock_func_interface, fortran_interface_test_func_pointerargs(testing::_, testing::_))
.WillOnce(testing::DoAll(
testing::SaveArgPointee<0>(&passed_scalar),
testing::SetArrayArgument<1>(passed_array, passed_array + 3)
));
testfunc_pointer(&mock_func_interface);
std::cout << passed_scalar << std::endl; // prints 123
std::cout << passed_array[0] << " " << passed_array[1] << " " << passed_array[2] << std::endl; // prints 0 0 0
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
如何修改此测试,以便能够验证传递给fortran_interface_test_func_pointerargs
的数组的所有三个元素?我不能直接比较它们,因为我需要首先存储传递给testfunc_pointer
的数组,而当前使用SetArrayArgument
的实现不可能做到这一点
1条答案
按热度按时间dddzy1tm1#
好吧,我在谷歌工具箱里找不到任何可以解决这个问题的东西。
但这可以通过提供自己的matcher来解决:
这个匹配器允许将指针参数转换为其他匹配器处理的指针和大小的元组,如
std::span
(自C++20起可用)。因此,测试可以这样调整(修改我的MCVE从评论):