我有一组代码可以将作业添加到作业类@Activate方法中的特定队列中。当我为类运行 JUnit 时,我收到 nullPointer 异常。PFB 我的代码:
// MyJob.java
public abstract class myJob implements JobExecutor{
private ScheduledJobInfo jobInfo;
@Reference
private JobManager jobManager;
private String topicName = "abc/xyz";
private String cron= "0 0 0/12 ? * MON-FRI *";
// my activate method
@Activate
protected void activate(final Map<String, Object> config) {
jobInfo = jobManager.createJob(topicName)
.properties(config)
.schedule()
.cron(cron).add();}
}
@Override
public JobExecutionResult process(Job samplejob, JobExecutionContext samplecontext){
// logic inside process method
return samplecontext.result().message("test message").succeeded();
}
//my JUnit 测试类
@RunWith(MockitoJUnitRunner.class)
public class myJUnitTest{
@Mock
private Job job1;
@Mock
private JobExecutionContext context1;
@InjectMocks
private myJob sampleObj = new MyJob();
@Test
public void sampleActivate() throws Exception {
Map<String, Object> config = new HashMap<String, Object>();
config.put("abc", "abc");
sampleObj.activate(config);
sampleObj.process(job1, context1);
}
我的结果:
1. 虽然 JUnit 涵盖了 "jobManager.createJob(topicName).properties(config)",但当流来到 ".schedule()"2 时,会抛出 nullPointer
。我无法涵盖"返回samplecontext.result().message("test message").successed()",还抛出了nullPointer 。
谁能帮我解决这个问题? 提前谢谢。
此代码调用调用链中的多个方法:
jobManager.createJob(topicName)
.properties(config)
.schedule()
.cron(cron).add();
因此,您需要考虑每种方法返回的内容。 首先,为 jobManager 对象调用 createJob 方法。 因此,如果您模拟了jobManager,则可以使用Mockitowhen
来设置在对象上调用该方法时应返回的内容的期望。 该方法应返回 JobBuilder 对象,因此您需要设置该期望。 然后,在 createJob 返回的 JobBuilder 上,您可以设置属性方法应返回的内容的期望。 属性方法返回一个 JobBuilder,因此您可以使用when
来设置该期望。
设置完成后,您可以模拟将调用的 schedule() 方法。 我猜这不是您的全部代码,或者我认为您在尝试使用 jobManager 时会遇到异常,因为它不会在您的代码中的任何位置显示为模拟。
您可能需要添加如下所示的内容:
@Mock
private JobManager jobManager;
JobBuilder jobBuilder = Mockito.mock(JobBuilder.class);
Mockito.when(jobManager.createJob("abc/xyz").thenReturn(jobBuilder);
..然后更多相同的方法继续模拟将要调用的每个方法。 调用的每个方法可能需要模拟,以便在调用时它将返回预期的对象(可能是另一个模拟)。