您的位置:首页 > 其它

Mockito 向private final 赋值

2015-12-19 10:43 375 查看
一、

在添加unit test的时候,遇到了一个NPE(NullPoint Excepotion)的异常。

在exception的track发现,是由于private final logger私有域未赋值的情况,以下是解决方案。

通过使用反射机制进行赋值,采用MIT的Mockito的第三方工具进行初始化[有关Mockito的更多用法,稍后讲解]。代码如下

private void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}


二、

当类中的Field不是private static final而是private final时,上述方法将抛出NPE,具体异常可见于field.set方法。

如:private final IDataService ds = ServiceLocatorFactory.getLocator().getDataService();

此时可用powermockito的mockstatic进行复制

PowerMockito.mockStatic(ServiceLocatorFactory.class);
ServiceLocator sl = mock(ServiceLocator.class);
when(ServiceLocatorFactory.getLocator()).thenReturn(sl);
IDataService ds = mock(IDataService.class);
when(sl.getDataService()).thenReturn(ds);
ObservationQuery oq = mock(ObservationQuery.class);
when(ds.createObservationQuery()).thenReturn(oq);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单元测试