英文:
Spring batch:Test case for Tasklet - Key is not appearing in actual class when it is invoked from Test class
问题
我正在尝试学习批处理(Batch)和任务块(Tasklet)。
我正在为 Spring Batch 中的任务块代码编写测试用例。我在测试类中设置了一个映射(map),然后进行调试,但实际的类中并没有我从测试类中传递的键(key)。
MyEventTasklet.java
public class MyEventTasklet implements Tasklet {
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
TreeMap<String, Map<Integer, Set<Student>>> studentMap = chunkContext.getStepContext().getJobExecutionContext().get("keyOfStudentMap");
}
}
MyEventTaskletTest.java
@RunWith(MockitoJUnitRunner.class)
public class MyEventTaskletTest {
@Mock
StepContribution stepContribution;
@Mock
ChunkContext chunkContext;
@Mock
StepContext stepContext;
@InjectMocks
MyEventTasklet myEventTasklet = new MyEventTasklet();
@Test
public void testExecute() {
TreeMap<String, Map<Integer, Set<Student>>> studentMap = new TreeMap<>();
Map<Integer, Set<Student>> m2 = new TreeMap<>();
m2.put(100, createStudentData());
studentMap.put("keyOfStudentMap", m2);
Map<String, Object> map = new TreeMap<>();
map.put("keyOfStudentMap", new Object());
chunkContext = Mockito.mock(ChunkContext.class);
stepContribution = Mockito.mock(StepContribution.class);
stepContext = Mockito.mock(StepContext.class);
Mockito.when(stepContext.getJobExecutionContext()).thenReturn(map);
Mockito.when(chunkContext.getStepContext()).thenReturn(stepContext);
Mockito.when(chunkContext.getStepContext().getJobExecutionContext().get("keyOfStudentMap"))
.thenReturn((TreeMap<String, Map<Integer, Set<Student>>>) studentMap);
// 当我进行调试时,我能看到这里的 studentMap 对象内容为 {keyOfStudentMap={100=[StudentObject]}},
// 但是当我查看实际的类时,它变成了 {100=[StudentObject]}
}
}
我不确定为什么会出现这种情况,我是否做错了什么?非常感谢您提供任何帮助。
英文:
I am trying to learn Batch and Tasklet.
I am writing a test case for a Tasklet code in spring batch. I am setting a map in my Test class and debug, the actual class is not having the key which I am passing from my test class.
MyEventTasklet.java
public class MyEventTasklet implements Tasklet {
public RepeatStatus execute (StepContribution contribution, ChunkContext chunkContext){
TreeMap<String, Map<Integer, Set<Student>>> studentMap = chunkContext.getStepContext().getJobExecutionContext().get("keyOfStudentMap");
}
}
MyEventTaskletTest.java
@RunWith(MockitoJunitRunner.class)
public class MyEventTaskletTest{
@Mock
StepContribution stepContribution;
@Mock
ChunkContext chunkContext;
@Mock
StepContext stepContext;
@InjectMocks
MyEventTasklet myEventTasklet = new MyEventTasklet();
@Test
public void testExecute(){
TreeMap<String, Map<Integer, Set<Student>>> studentMap = new TreeMap<>();
Map<Integer, Set<Student>> m2 = new TreeMap<>();
m2.put(100, createStudentData());
studentMap.put("keyOfStudentMap", m2);
Map<String, Object> map = new TreeMap<>();
map.put("keyOfStudentMap", new Object());
chunkContext = Mockito.mock(ChunkContext.class);
stepContribution = Mockito.mock(StepContribution.class);
stepContext = Mockito.mock(StepContext.class);
Mockito.when(stepContext.getJobExecutionContext()).thenReturn(map);
Mockito.when(chunkContext.getStepContext()).thenReturn(stepContext);
Mockito.when(chunkContext.getStepContext().getJobExecutionContext().get("keyOfStudentMap"))
.thenReturn((TreeMap<String, Map<Integer, Set<Student>>>)studentMap);
// When I am debugging I can see here, the studentMap object which is having something like {keyOfStudentMap={100=[StudentObject]}},
but when I see in actual class it is becoming {100=[StudentObject]}
}
}
I am not sure why this is happening, I am doing something wrong? Any kind of help would be highly appreciated.
答案1
得分: 0
你的问题在这里:
Mockito.when(stepContext.getJobExecutionContext()).thenReturn(map);
map
不是一个 ExecutionContext
。你应该对一个 ExecutionContext
实例进行模拟/存根,而不是一个 Map<String, Object>
实例。你的任务应该调用:
chunkContext.getStepContext().getStepExecution().getJobExecution().getExecutionContext()
而不是:
chunkContext.getStepContext().getJobExecutionContext()
英文:
Your problem is here:
Mockito.when(stepContext.getJobExecutionContext()).thenReturn(map);
map
is not an ExecutionContext
. You should be mocking/stubbing an ExecutionContext
instance and not a Map<String, Object>
instance. Your tasklet should be calling:
chunkContext.getStepContext().getStepExecution().getJobExecution().getExecutionContext()
instead of:
chunkContext.getStepContext().getJobExecutionContext()
专注分享java语言的经验与见解,让所有开发者获益!
评论