我正在使用MRUnit为我的mapreduce作业编写单元测试。
但是,我遇到麻烦,包括hdfs。我的MR工作需要来自hdfs的文件。如何在MRUnit测试用例中模拟出hdfs部分?
编辑:
我知道我可以在测试基础架构中为我的MR代码指定输入/ exepctedOutput。但是,这不是我想要的。我的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));
}
这个解决方案并不理想,因为我必须在我的生产代码中加入特定于测试的代码。我还在等着看那里是否有一个优雅的解决方案。
答案 0 :(得分:0)
请按照这个关于MRUnit的小教程。
<强> https://github.com/malli3131/HadoopTutorial/blob/master/MRUnit/Tutorial 强>
在MRUnit测试用例中,我们提供了testMapper()和testReducer()方法中的数据。因此,不需要HDFS为MRUnit Job输入。只有MapReduce作业需要来自HDFS的数据输入。