我正在使用mrunit为我的mapreduce工作编写单元测试。
然而,我有困难,包括hdfs的混合。我的mr工作需要hdfs的文件。如何在mrunit测试用例中模拟hdfs部分?
编辑:
我知道我可以在测试基础设施中为mr代码指定inputs/exepctedoutput。然而,这不是我想要的。我的mr作业需要读取另一个包含域数据的文件才能执行该作业。这个文件是hdfs格式的。如何模拟这个文件?
我试着用mockito,但没用。原因是filesystem.open()返回从java.io.stream以外的其他接口继承的fsdatainputstream。模仿所有的接口太痛苦了。所以,我在我的代码中做了如下操作
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));
}
这个解决方案并不理想,因为我必须在我的产品代码中放入特定于测试的代码。我还在等着看是否有一个优雅的解决方案。
1条答案
按热度按时间tpxzln5u1#
请按照这个mrunit小教程。
https://github.com/malli3131/hadooptutorial/blob/master/mrunit/tutorial
在mrunit测试用例中,我们在testmapper()和testreducer()方法中提供数据。因此,mrunit作业不需要hdfs的输入。只有mapreduce作业需要来自hdfs的数据输入。