美文网首页
FeignClient导致Mock单元测试报空指针异常

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

作者: blue大花猫 | 来源:发表于2020-10-23 17:07 被阅读0次

    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);
        }
    

    相关文章

      网友评论

          本文标题:FeignClient导致Mock单元测试报空指针异常

          本文链接:https://www.haomeiwen.com/subject/kkgvmktx.html