我正在使用 MRUnit 为我的 mapreduce 作业编写单元测试。
但是,我在将 hdfs 包含在该组合中时遇到了麻烦。我的 MR 工作需要来自 hdfs 的文件。如何模拟 MRUnit 测试用例中的 hdfs 部分?
编辑:
我知道我可以在测试基础设施中为我的 MR 代码指定输入/执行输出。然而,这不是我想要的。我的 MR 工作需要读取另一个具有域数据的文件才能完成这项工作。该文件位于 HDFS 中。我如何模拟这个文件?
我尝试使用 mockito,但它没有用。原因是 FileSystem.open() 返回一个 FSDataInputStream,它继承自 java.io.Stream 之外的其他接口。模拟所有接口太痛苦了。所以,我通过执行以下操作在我的代码中破解了它
if (System.getProperty("junit_running") != null)
{
inputStream = this.getClass().getClassLoader().getResourceAsStream("domain_data.txt");
br = new BufferedReader(new InputStreamReader(inputStream));
} else {
Path pathToRegionData = new Path("/domain_data.txt");
LOG.info("checking for existence of region assignment file at path: " + pathToRegionData.toString());
if (!fileSystem.exists(pathToRegionData))
{
LOG.error("domain file does not exist at path: " + pathToRegionData.toString());
throw new IllegalArgumentException("region assignments file does not exist at path: " + pathToRegionData.toString());
}
inputStream = fileSystem.open(pathToRegionData);
br = new BufferedReader(new InputStreamReader(inputStream));
}
这个解决方案并不理想,因为我必须将测试特定代码放在我的生产代码中。我还在等着看是否有一个优雅的解决方案。