在将现有内部版本迁移到bazel的方式中,我有一个子模块mod1,该子模块具有一些JUnit测试,这些测试从“ testdata”目录中读取文件。尝试加载这些文件时,我必须使用“ mod1 / testdata / test.txt”而不是“ testdata / test.txt”,即,单元测试必须知道其对应的bazel模块目录。
(1)这对于bazel 0.23.2@debian和0.23.2-homebrew是正确的行为吗?
(2)有没有一种方法可以使用.java测试而无需更改,并且不需要在bazel数据/运行文件中使用“ mod1”前缀?
我的示例项目在这里:https://gitlab.com/jhinrichsen/bazel-data-test。我正在寻找一种对根模块和子模块使用相同路径“ testdata / test.txt”的方法。在我的示例项目中,bazel test AllTests
成功,而bazel test mod1/AllTests
失败,因为我需要在“ testdata / test.txt”之前加上“ mod1 /”。
由于我无法修改现有的测试源,因此没有寻找基于资源/类路径的解决方案。
答案 0 :(得分:0)
您看到的行为确实是正确的行为,并且无法使用本机Java规则剥离“ mod1”前缀。 data
中包含的所有内容都将按照您看到的方式限制在其自己的包中。
原因很简单。假设您的测试目标//mod1:AllTests
也依赖于假设的//mod2:tests
库。假设假设的库 也有一个testdata/test.txt
作为数据依赖项。除非将多个test.txt
文件命名为它们的软件包的名称空间,否则它们将发生冲突。
如果您完全不能修改测试源,那么您就很困。这是关于此的先前讨论: https://groups.google.com/forum/#!topic/bazel-discuss/w6TDwSZvN0k
如果您要尝试使用Bazel,我建议您接受运行文件的概念,并修改测试以使其与运行文件结构一起使用,或者接受用于在何处找到测试数据的命令行参数。 / p>