我在C中编码并使用gtest for C ++进行单元测试。
我想测试一些变量获得整数溢出的情况,但在UT中增加该变量需要太长时间。此变量仅在初始化期间直接写入计数器,并在某些事件上递增。我的想法是在初始化期间将计数器模拟为最大整数值,但我不想模拟初始化计数器的函数,因为在此函数中初始化了对UT很重要的各种其他数据。
gtest是否可以这样做,或者我是否需要实现一个存根,该存根将具有实际功能的所有功能并初始化所需的计数器值到计数器?
我无法分享代码,因为它受版权保护,但此处的摘录显示了一般概念:
typedef struct {
some_variable;
another_variable;
counter;
} data_structure_defined_only_in_this_file;
...
// check_some_parameters() isn't exported in header files
void check_some_parameters(data_structure_defined_only_in_this_file *container) {
if (something == true)
container->counter++;
}
...
// initialization() isn't exported in header files
void initialization() {
data_structure_defined_only_in_this_file *container;
...
container = (struct data_structure_defined... *)calloc(1, sizeof(struct data_structure_defined...));
}
在将内存分配给容器后,我在初始化期间创建了另一个函数。此函数返回值,该值已作为初始值分配给计数器。
source_file.c
// init_counter_val() IS exported to header file included in UT
int init_counter_val() { return 0; }
void initialization() {
data_structure_defined_only_in_this_file *container;
...
container = (struct data_structure_defined... *)calloc(1, sizeof(struct data_structure_defined...));
container->counter = init_counter_val();
}
unit_test.cc
...
ON_CALL(mockObj, init_counter_val()).WillByDefault(Return(INT_MAX));
...
我模拟了单元测试的函数,以便在函数调用时返回最大整数值但该解决方案未被接受,因为生产代码将被更改为启用单元测试。但是既然数据结构类型和写入计数器的函数都没有从源文件中导出,我相信嘲笑是不可能的。