1.产生原因
我欲对OrgTypeServiceImpl
编写单元测试类,因OrgTypeServiceImpl
中的orgService
属性是一个FeignClient,导致在跑单元测试的时候,报orgService空指针异常。
话不多说,直接上代码,下面是我的Service类。
@Component
@Slf4j
public class OrgTypeServiceImpl implements MetadataQueryService {
@Autowired
private OrgService orgService;
@Override
public <T> T queryData(Integer layer, Boolean power) {
return (T) orgService.buildOrgTree(layer, power).getResult();
}
}
下面是FeignClient的接口。
@FeignClient(name = "sys-rpc")
public interface OrgService {
@GetMapping(value = "/org/buildOrgTree")
public ServiceResult<List<Org>> buildOrgTree(@RequestParam(value = "layer", required = false, defaultValue = "1") Integer layer,
@RequestParam(value = "power", required = false) Boolean power);
}
下面是单元测试类。
@RunWith(PowerMockRunner.class)
@PrepareForTest(OrgTypeImpl.class)
public class OrgTypeImplTest {
@InjectMocks
OrgTypeImpl impl;
@Mock
private OrgService orgService;
@Test
public void testQueryData1() {
List<Org> orgList = Lists.newArrayList();
orgList.add(Org.builder().code("1001").build());
ServiceResult result = ServiceResult.success(orgList);
PowerMockito.when(orgService.buildOrgTree(Mockito.anyInt(), Mockito.anyBoolean())).thenReturn(result);
impl.queryData(MetadataInfo.builder().build(), parameters);
}
在执行到queryData()方法时,debug查看orgService,会发现orgService是null,所以就报空指针了。
2.分析原因
我猜测,虽然我们在测试类里Mock了OrgService,但因为OrgService是一个接口文件,导致我们模拟的实例对象并没有在真正查询的时候使用,而还是使用真正的远程接口。
3.解决办法
手动指定OrgTypeServiceImpl
中的OrgService
为我们Mock的实例。在单元测试类中的@Before方法中添加如下代码。通过反射的方式给私有变量赋值。
@Before
public void setUp() throws NoSuchFieldException {
Field orgServiceField = OrgTypeImpl.class.getDeclaredField("orgService");
new FieldSetter(impl, orgServiceField).set(orgService);
}
网友评论