FeignClient导致Mock单元测试报空指针异常

2020-10-23  本文已影响0人  blue大花猫

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);
    }
上一篇 下一篇

猜你喜欢

热点阅读