我正在编写单元测试,我需要将“static const char [] path =”/ some / hardcoded / path“中的路径覆盖到其他地方。最好的办法是什么。我认为可以做到通过LD_PRELOAD,但它需要我创建另一个库。还有其他简单的方法吗?
答案 0 :(得分:3)
将其注释掉并添加到您自己的路径中。
你不想取消const
某事。
如果需要,请将其放入预处理程序块中:
#ifndef __UNIT_TEST
static const char[] path = "/some/hardcoded/path";
#else
static const char[] path = "/some_other/hardcoded/path";
#endif
然后它也不会在原始程序员的系统上失败。
答案 1 :(得分:1)
隐藏它是一个选项吗?像这样:
static const char* path = "...";
void f()
{
#if UNIT_TESTING
static const char* path = "Ha!";
#endif
cout << path;
}
答案 2 :(得分:0)
在执行时更改此类字符串的值是未定义的行为。在许多系统上,实现定义的响应是丢弃核心(分段错误)。也就是说,许多UNIX应用程序中以前常见的范例是具有硬编码但可配置的路径名。名称在编译时而不是执行时设置:
static const char * path = SOME_PREPROCESSOR_NAME;
答案 3 :(得分:0)
如果你想要hacky,并且无法直接更改源代码,可以在Unix上使用mprotect(),在Win32上使用VirtualProtect(),使该数组的页面可读/可写/可执行为不得已。
答案 4 :(得分:0)
如果您的系统支持它,请将硬编码文件设置为您想要的符号链接。像ln -T /where/i/want/file /some/hardcoded/path/file