gpt4 book ai didi

java - 在 Apache Flink 1.4 中模拟 ListState

转载 作者:行者123 更新时间:2023-12-01 16:14:19 26 4
gpt4 key购买 nike

我正在为 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");

// ...
}

}
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(...)
}
}

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

最佳答案

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

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

最重要的是, MockitoAnnotations.initMocks(this); 在您的示例中似乎没有执行任何操作:您没有向我们显示任何用 @Mock 注释的字段或@InjectMocks

更新

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

你应该做什么:

  • 删除MockitoAnnotations.initMocks(this);,您将手动创建所有模拟。
  • ProcessFunctionClass中添加构造函数
public ProcessFunctionClass(ListState<String> listState) {
this.listState = listState
}
  • 在测试中使用此构造函数
var mockListState = mock(ListState.class);
var processFunctionClass = new ProcessFunctionClass();

关于java - 在 Apache Flink 1.4 中模拟 ListState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62444776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com