2013-09-24 2 views
0

다음 감속 코드가 있으며 테스트를 위해 PowerMock을 사용하려고합니다. package com.cerner.cdh.examples.reducer; 다음은 MapReduce 코드 테스트 용 PowerMockito

public class LinkReversalReducer extends TableReducer<Text, Text, ImmutableBytesWritable> { 

    @Override 
    protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { 

     StringBuilder inlinks = new StringBuilder(); 

     for (Text value : values) { 
      inlinks.append(value.toString()); 
      inlinks.append(" "); 
     } 

     byte[] docIdBytes = Bytes.toBytes(key.toString()); 

     Put put = new Put(docIdBytes); 

     put.add(WikiConstants.COLUMN_FAMILY_BYTES, WikiConstants.INLINKS_COLUMN_QUALIFIER_BYTES, 
       Bytes.toBytes(inlinks.toString().trim())); 

     context.write(new ImmutableBytesWritable(docIdBytes), put); 
    } 
} 

내가 위를 위해 작성 한 테스트입니다 :

@Test 
public void testLinkReversalReducer() throws IOException, InterruptedException { 

     Text key = new Text("key"); 
     @SuppressWarnings("rawtypes") 
     Context context = PowerMockito.mock(Context.class); 
     Iterable<Text> values = generateText(); 

     StringBuilder inlinks = new StringBuilder(); 

     for (Text value : values) { 
      inlinks.append(value); 
      inlinks.append(" "); 
     } 

     LinkReversalReducer reducer = new LinkReversalReducer(); 

     byte[] docIdBytes = Bytes.toBytes(key.toString()); 

     byte[] argument1 = WikiConstants.COLUMN_FAMILY_BYTES; 
     byte[] argument2 = WikiConstants.INLINKS_COLUMN_QUALIFIER_BYTES; 

     byte[] argument3 = Bytes.toBytes(inlinks.toString().trim()); 

     Put put = new Put(docIdBytes); 
     put.add(argument1, argument2, argument3); 

     reducer.reduce(key, values, context); 

     Mockito.verify(context).write(new ImmutableBytesWritable(docIdBytes), put); 
    } 

    private List<Text> generateText() { 
     Text value = new Text("AB"); 
     List<Text> texts = new ArrayList<Text>(); 
     texts.add(value); 
     return texts; 
    } 
} 

그래서 일이 내 Mockito.verify (문맥)에 .write (새 ImmutableBytesWritable (docIdBytes)을 넣어)이다; 올바른 값으로 호출되는 것 같고 내 junit 결과는 Invoked 및 Actual이 동일한 응답을 제공함을 보여줍니다. 그러나 시험은 여전히 ​​실패로 보인다. 누구는 단서가 있습니까? . 어떤 도움을 주시면 감사하겠습니다 :)

+0

하면 실패 메시지 나 스택 트레이스를 제공 할 수 있습니다 :

는 다음 당신이 할 수있는이 문제를 해결하려면? –

답변

0

여기에서 문제는 Put 클래스가 equals 메서드를 정의하지 않는다는 것입니다. 따라서 verify 메서드는 메서드 내에서 context.write으로 전달 된 Put 실제 값이 testLinkReversalReducer 메서드에서 예상되는 Put과 다를 것으로 생각합니다.

Mockito.verify(context).write(Mockito.eq(new ImmutableBytesWritable(docIdBytes)), MockitoHelper.eq(put)); 

... 

class MockitoHelper { 
    public static Put eq(final Put expectedPut) { 
     return Mockito.argThat(new CustomTypeSafeMatcher<Put>(expectedPut.toString()) { 
      @Override 
      protected boolean matchesSafely(Put actualPut) { 
       return Bytes.equals(toBytes(expectedPut), toBytes(actualPut)); 
      } 
     }); 
    } 

    private static byte[] toBytes(Put put) { 
     ByteArrayDataOutput out = new ByteArrayDataOutput(); 
     try { 
      put.write(out); 
      return out.toByteArray(); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
관련 문제