Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ApacheFlink 1.4中模拟ListState_Java_Mocking_Mockito_Apache Flink_Flink Streaming - Fatal编程技术网

Java 在ApacheFlink 1.4中模拟ListState

Java 在ApacheFlink 1.4中模拟ListState,java,mocking,mockito,apache-flink,flink-streaming,Java,Mocking,Mockito,Apache Flink,Flink Streaming,我正在为Apache Flink 1.4中的processElement函数编写一些测试代码: public class ProcessFunctionClass { public void processElement(Tuple2<String, String> tuple2, Context context, Collector<Tuple2<String, String>> collector) { // if the s

我正在为Apache Flink 1.4中的processElement函数编写一些测试代码:

public class ProcessFunctionClass {

    public void processElement(Tuple2<String, String> tuple2,  Context context, Collector<Tuple2<String, String>> collector) {

        // if the state is empty, start a timer
        if (listState.get().iterator().hasNext() == false)
            context.timerService().registerEventTimeTimer(1000);

        listState.add("someStringToBeStored");

        // ...
    }

}
当我使用IDE进行调试时,就在我进入processElement方法之前,listState不是null,并且似乎已成功模拟,但当我到达listState.get.iterator.hasNext时,listState是null,并且我得到一个NullPointerException。我做错了什么?

在ProcessFunctionClass中,您有一个私有listState变量。 在测试中,您创建了一个完全不相关的mockListState变量,并对其设置了一些期望值

为了使测试正常工作,必须提供一种方法,让构造函数或setter将ProcessFunctionClass.listState设置为模拟列表状态所需的值

最重要的是,MockitoAnnotations.initMocksthis;在您的示例中似乎什么都不做:您没有向我们显示任何用@Mock或@injectmock注释的字段

更新

您误用了@Mock注释。 您应该将它放在测试类中,而不是被测试的类中。 当放置在测试类中时,在调用initMocks之后,将使用适当类型的mock初始化该字段

你应该做的是:

删除MockitoAnnotations.initMocksthis;,您正在手动创建所有模拟。 在ProcessFunctionClass中添加构造函数
我编辑代码以添加模拟注释,它已经存在于我的代码中。至于使用setter或构造函数,你能举个例子吗?我在API文档中没有看到使用一个是必要的。我的主代码中没有使用setter?有区别吗?我的测试类中确实有mock变量。在这里,我错误地将它放在了主类中。为了实现ProcessFunction的单元测试,您可能会发现使用为此目的创建的测试工具非常有趣。有关详细信息和示例,请参见。
public class ProcessFunctionClassTest {

    private ProcessFunctionClass processFunctionClass;

    @Mock
    private ListState<String> listState;

    @Before
    public void setUp() throws Exception {
        processFunctionClass = new ProcessFunctionClass();
    }

    @Test
    public void testProcessElement() {

        ListState mockListState = mock(ListState.class);
        Iterable mockIterable = mock(Iterable.class);
        Iterator mockIterator = mock(Iterator.class);
        MockitoAnnotations.initMocks(this);

        when(tDPListState.get()).thenReturn(mockIterable);
        when(tDPListState.get().iterator()).thenReturn(mockIterator);
        when(tDPListState.get().iterator().hasNext()).thenReturn(false);

        processFunctionClass.processElement(tuple2, context, collector);

        // verify(...)
    }
}
public ProcessFunctionClass(ListState<String> listState) {
    this.listState = listState
}
var mockListState = mock(ListState.class);
var processFunctionClass = new ProcessFunctionClass();