无法验证从静态方法调用的方法

Can not verify a method which is called from a static method

我必须验证一个方法是从静态方法调用的。

// Class name: PerformJob
// Method to be tested
public static void job(Context context) {
   JobScheduler jobScheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
   if (jobScheduler != null) {
      JobInfo pendingJob = jobScheduler.getPendingJob(Job.POLLING_JOB_ID);
   }
}

我测试的 code:I 想验证当 jobScheduler 实例不为 null 时,它会调用 getPendingJob()。

@PrepareForTest({Context.class, PerformJob.class, JobScheduler.class, JobInfo.class})
@Mock
Context mContext;
@Test
void jobTest(){
   mockStatic(PerformJob.class);
   JobScheduler scheduler = mock(JobScheduler.class);
   JobInfo pendingJob = mock(JobInfo.class)
   when(mContext.getSystemService(JOB_SCHEDULING_SERVICE).thenReturn(scheduler);
   when(scheduler.getPendingJob(Job.POLLING_JOB_ID)).thenReturn(pendingJob);
   PerformJob.job(mContext);
   
   // Job.POLLING_JOB_ID is an Int
   verify(scheduler, times(1)).getPendingJob(Job.POLLING_JOB_ID); // It fails.
   
}

注意:PerformJob 是静态的class

错误消息是:“需要但未调用...实际上与此模拟的交互为零。”

这里有什么问题?为什么验证失败?请帮忙。我是新手。我搜索了相同类型的问题,但找不到任何类似的问题解决方案。等待帮助。谢谢

首先,您不需要模拟 PerformJob class 和包含 PerformJob class.[=18 的 class =]

考虑以下几点: 假设您有一个名为 Abc 的 class 并且在 Abc class 中您有一个名为 JobPerformer 的静态 class,其中包含一个静态方法job 如下所示:

public class Abc {

  public static class JobPerformer {
    public static void job(Context context) {
        JobScheduler jobScheduler = (JobScheduler) 
        context.getSystemService(JOB_SCHEDULER_SERVICE);
        if (jobScheduler != null) {
          JobInfo pendingJob = jobScheduler.getPendingJob(Job.POLLING_JOB_ID);
        }
    }
  }
}

现在测试class你需要的是:

private Abc subject;

@Mock
private Context mContext;

@Before
public void setUp() {
    subject = new Abc();
}

@Test
public void testJob() {

    JobScheduler scheduler = mock(JobScheduler.class);
    JobInfo pendingJob = mock(JobInfo.class)
    when(mContext.getSystemService(JOB_SCHEDULING_SERVICE)
    .thenReturn(scheduler);
    when(scheduler.getPendingJob(Job.POLLING_JOB_ID)).thenReturn(pendingJob);

    Abc.JobPerformer.job(mContext);
    
    verify(scheduler).getPendingJob(Job.POLLING_JOB_ID);
}

如你所见,我不需要模拟 Abc class。

您正试图在模拟的 class 上调用方法。您需要要测试的 class 的真实实例。