如何解决调用 powermockito 测试方法时出现 NullPointerException
我是使用 powermockito 进行单元测试的新手,目前我正在尝试测试调用 java.util.Timer.scheduleAtFixedRate
的方法。我试图运行测试,但它失败了,并在对象调用方法的行显示 NullPointerException
,我认为这里的对象不为空。这是我的代码,我总结了可能导致问题的部分。
DailyReminderTest.java
@RunWith(PowerMockRunner.class)
@PrepareForTest(DailyReminder.class)
public class DailyReminderTest {
@InjectMocks
DailyReminder dailyReminder;
@Mock
User user;
@Mock
Timer mockTimer;
@Mock
TimerTask mockTask;
@BeforeEach
public void setUp() {
TimerTask task = new MyTask(user);
mockTask = mock(task.getClass());
dailyReminder = new DailyReminder() {
@Override
public Timer createTimer() {
return mockTimer;
}
@Override
public TimerTask createTask() {
return mockTask;
}
};
}
@Test
void testRemind() throws Exception {
dailyReminder.remind(); // here is the line where NullPointerException occured
verify(mockTimer).scheduleAtFixedRate(eq(mockTask),any(Date.class),anyLong());
}
}
DailyReminder.java
public class DailyReminder {
private Timer timer;
private TimerTask task;
private User user;
private Date dateStart;
private final Duration fixedDuration = Duration.of(1,ChronoUnit.DAYS);
// some constructor here...
public void remind() {
timer = createTimer();
task = createTask();
timer.scheduleAtFixedRate(task,dateStart,fixedDuration.toMillis());
}
public Timer createTimer() {
return new Timer();
}
public TimerTask createTask() {
return new MyTask(user);
}
}
我也尝试过 assertNull(dailyReminder)
但是堆栈跟踪显示
org.opentest4j.AssertionFailedError: expected: <null> but was: <Daily Reminder>
这很奇怪,dailyReminder 没有为空。对此有什么解释吗?
解决方法
如果您使用 PowerMockRunner
,则必须调用 MockitoAnnotations.initMocks()
以初始化使用注释创建的模拟。目前 mockTimer
为空,为您提供 NPE。您可以像对其他模拟一样在 beforeEach
中对其进行初始化,也可以调用 initMocks()
来解决此问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。