【问题标题】:How to Mock JobBuilder.ScheduleBuilder.schedule() using powerMockito?如何使用 powerMockito 模拟 JobBuilder.ScheduleBuilder.schedule()?
【发布时间】:2017-05-27 17:47:22
【问题描述】:

我有一组代码可以将作业添加到 Job 类的 @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();
}

//我的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()”时抛出nullPointer
2.我无法覆盖"return samplecontext.result().message("test message").succeeded()",还会抛出nullPointer。

谁能帮我解决这个问题? 提前致谢。

【问题讨论】:

    标签: junit mockito jobs job-scheduling powermockito


    【解决方案1】:

    这段代码在调用链中调用了几个方法:

    jobManager.createJob(topicName)
                    .properties(config)
                    .schedule()
                    .cron(cron).add();
    

    因此,您需要考虑每个方法返回的内容。首先,为 jobManager 对象调用 createJob 方法。因此,如果您已经模拟了 jobManager,您可以使用 Mockito when 来设置对对象调用该方法时应该返回的内容的期望。该方法应返回一个 JobBuilder 对象,因此您需要设置该期望。然后,在 createJob 返回的 JobBuilder 上,您可以设置 properties 方法应该返回的期望值。 properties 方法返回一个 JobBuilder,因此您可以再次使用 when 来设置期望值。

    一旦设置好,您就可以模拟出将被调用的 schedule() 方法。我猜这不是您的所有代码,或者我认为您在尝试使用 jobManager 时会遇到异常,因为它在您的代码中的任何地方都没有显示为模拟。

    您可能需要添加如下内容:

    @Mock
    private JobManager jobManager;
    
    JobBuilder jobBuilder = Mockito.mock(JobBuilder.class);
    
    Mockito.when(jobManager.createJob("abc/xyz").thenReturn(jobBuilder);
    

    ..然后更多相同的内容继续模拟将被调用的每个方法。调用的每个方法都可能需要被模拟,以便在调用时返回预期的对象(可能是另一个模拟对象)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 2020-10-28
      相关资源
      最近更新 更多