无法验证从静态方法调用的方法
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 的真实实例。
我必须验证一个方法是从静态方法调用的。
// 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 的真实实例。