如何对Flink ProcessFunction进行单元测试?

时间:2018-07-02 13:03:46

标签: java junit apache-flink flink-streaming

我有一个简单的ProcessFunction,它接受String作为输入,并给出String作为输出。如何使用Junit进行单元测试?由于processElement方法是void方法,因此不返回任何值。

public class SampleProcessFunction extends ProcessFunction<String, String>{
    @Override
    public void processElement(String content, Context context, Collector<String> collector) throws Exception {
        String output = content + "output";
        collector.collect(output);
    }
}

2 个答案:

答案 0 :(得分:2)

为了对该方法进行单元测试,请定义预期的行为。在这种情况下,预期的行为是使用Collector::collect作为参数的content + "output"方法的单次调用。 因此,可以使用模拟收集器对此进行测试。

以下是使用Mockito框架的示例:

...

private final Collector<String> collectorMock = Mockito.mock(Collector.class);
private final Context contextMock = Mockito.mock(Context.class);

private final SampleProcessFunction sampleProcessFunction = new SampleProcessFunction();

@Test
public void testProcessElement_shouldInvokeCollector_whenAnyValuePassed() throws Exception {
    // given
    final String content = "hello ";

    // when
    sampleProcessFunction.processElement(content, contextMock, collectorMock);

    // then
    Mockito.verify(collectorMock).collect(content + "output"); // verifies that collector method was invoked with "hello output" exactly once
}

...

答案 1 :(得分:0)

如果要在对象上使用,可以使用:

Component1