使用bazel为具有模拟依赖关系的C构建单元测试
我有一个C代码库,我正在尝试用Bazel构建.这个代码库包含单元测试,使用
fff库在C中生成函数模拟.虽然实际库并不重要,但我对函数模拟的整个概念有疑问.
现在我有一个makefile,我链接并运行我的测试.当我构建测试时,我编译并链接测试库和测试源本身.此测试还定义了库依赖项的模拟.链接时,模拟符号会被解析为模拟实现,并且所有内容都按预期工作.但它这样做的原因是我没有链接实际的依赖库,我只链接测试源中定义的模拟符号. 主要问题是:我如何使用Bazel做到这一点?当链接cc_test目标的二进制文件时,Bazel compilis并链接所有传递依赖项.由于受测试的库依赖于(通过deps)符号的实际实现,这个真实的定义与模拟的一起被链接,自然我得到这个错误:XXX的多重定义. 例: cc_library( name = "a",# a.cc has the real version of "void some_function()". srcs = ["a.cc"],hdrs = ["a.h"],) # This test is working just fine. cc_test( name = "a_test",srcs = ["a_test.cpp"],deps = [":a"],) cc_library( name = "b",# b.cc includes a.h and uses "void some_function()". srcs = ["b.cc"],hdrs = ["b.h"],) # This test has two definitions for "void some_function()": # the real one and the mock one. cc_test( name = "b_test",# b_test.cpp has the mock version of "void some_function()". srcs = ["b_test.cpp"],deps = [":b"],) 我不是巴泽尔的新手,但我也不是专家,花了很多时间尝试我失败的事情.有关如何使其工作的任何建议? 解决方法
您的问题可能是一个非常基本的问题,它与名称空间和/或扩展类有关.
根据定义,c没有名称空间,但可以以某种方式模拟它们: 但是,由于您可能使用c而且从不使用c,因此可以直接使用命名空间. 具体的问题是你有两倍的功能,用命名空间a.some_function()和b.some_function()表示. 在Bazel中有几个选项如何解决它,我发布了简短的复制片段,你要在链接页面上阅读的细节. deps = [ "@gtest//:main","//lib:hello-greet",], 链接:https://docs.bazel.build/versions/master/cpp-use-cases.html 然后在Bazel中存在工具链,这是一个例子: config_setting( name = "on_linux",constraint_values = [ "@bazel_tools//platforms:linux",) config_setting( name = "on_windows",constraint_values = [ "@bazel_tools//platforms:windows",) bar_binary( name = "myprog",srcs = ["mysrc.bar"],compiler = select({ ":on_linux": "//bar_tools:barc_linux",":on_windows": "//bar_tools:barc_windows",}),) 链接:https://docs.bazel.build/versions/master/toolchains.html 因为我不是用c或c编程,所以我需要花费相当长的时间来挖掘解决方案,所以我要保持它没有真正的解决方案,但我希望问题和解决方法的方法得到了一点清楚.我首先尝试使用第二个链接,位于上面的第一个片段下面. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |