0

次のレデューサー コードがあり、PowerMock を使用してテストしようとしています。パッケージcom.cerner.cdh.examples.reducer;

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(context).write(new ImmutableBytesWritable(docIdBytes), put); ということです。適切な値で呼び出されたようで、私のjunitの結果は、InvokedとActualが同じ応答を返すことを示しています。しかし、テストはまだ失敗しているようです。誰も手がかりを持っていますか?. どんな助けでも大歓迎です:)

4

1 に答える 1

0

ここでの問題は、クラスがメソッドPutを定義していないことです。equalsしたがって、メソッドは、メソッド内verifyに実際Putに渡されたものは、メソッドで組み立てられたものとは異なると考えています。context.writeLinkReversalReducer.reducePuttestLinkReversalReducer

この問題を回避するには、次のようにします。

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);
        }
    }
}
于 2013-10-09T20:05:46.483 に答える