### Question:
ContextFactory { @SuppressWarnings("unchecked") public static <K1,V1,K2,V2> Mapper<K1,V1,K2,V2>.Context cloneMapContext(MapContext<K1,V1,K2,V2> context, Configuration conf, RecordReader<K1,V1> reader, RecordWriter<K2,V2> writer ) throws IOException, InterruptedException { try { Object outer = OUTER_MAP_FIELD.get(context); if ("org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context".equals (context.getClass().getName())) { context = (MapContext<K1,V1,K2,V2>) WRAPPED_CONTEXT_FIELD.get(context); } if (reader == null) { reader = (RecordReader<K1,V1>) READER_FIELD.get(context); } if (writer == null) { writer = (RecordWriter<K2,V2>) WRITER_FIELD.get(context); } if (useV21) { Object basis = MAP_CONTEXT_IMPL_CONSTRUCTOR.newInstance(conf, context.getTaskAttemptID(), reader, writer, context.getOutputCommitter(), REPORTER_FIELD.get(context), context.getInputSplit()); return (Mapper.Context) MAP_CONTEXT_CONSTRUCTOR.newInstance(outer, basis); } else { return (Mapper.Context) MAP_CONTEXT_CONSTRUCTOR.newInstance(outer, conf, context.getTaskAttemptID(), reader, writer, context.getOutputCommitter(), REPORTER_FIELD.get(context), context.getInputSplit()); } } catch (IllegalAccessException e) { throw new IllegalArgumentException("Can't access field", e); } catch (InstantiationException e) { throw new IllegalArgumentException("Can't create object", e); } catch (InvocationTargetException e) { throw new IllegalArgumentException("Can't invoke constructor", e); } }  @SuppressWarnings("unchecked") static JobContext cloneContext(JobContext original,
                                        Configuration conf
                                        ); @SuppressWarnings("unchecked") static Mapper<K1,V1,K2,V2>.Context cloneMapContext(MapContext<K1,V1,K2,V2> context,
                       Configuration conf,
                       RecordReader<K1,V1> reader,
                       RecordWriter<K2,V2> writer
                      );  }### Answer:
@Test public void testCloneMapContext() throws Exception { TaskID taskId = new TaskID(jobId, TaskType.MAP, 0); TaskAttemptID taskAttemptid = new TaskAttemptID(taskId, 0); MapContext<IntWritable, IntWritable, IntWritable, IntWritable> mapContext = new MapContextImpl<IntWritable, IntWritable, IntWritable, IntWritable>( conf, taskAttemptid, null, null, null, null, null); Mapper<IntWritable, IntWritable, IntWritable, IntWritable>.Context mapperContext = new WrappedMapper<IntWritable, IntWritable, IntWritable, IntWritable>().getMapContext( mapContext); ContextFactory.cloneMapContext(mapperContext, conf, null, null); }