当前位置:   article > 正文

使用powermock的@PrepareForTest注解导致java.lang.NullPointerException的解决办法_preparefortest注解不能mock

preparefortest注解不能mock

在使用powermock时,要测试的类里有@Autowired方式注入的dao类,同时我还要mock这个类里的私有方法,所以使用了powermock的@PrepareForTest注解,但是在加上@PrepareForTest注解后,原本mock的dao类,在test时,报了java.lang.NullPointerException,mock的dao没有注入成功,不明白是否是powermock的bug,最后只能通过另外一种方式来将dao注入到要测试的类里,如下:

  1. /**
  2. * @InjectMocks 声明这个对象中的属性会被自动注入进来, 也就是下面 mock 出来的 userService
  3. * 注意这里说的 mock 出来的对象, 包括 @Mock@Spy 声明的对象
  4. */
  5. @InjectMocks
  6. private ContractBillService contractBillService;
  7. /**
  8. * 使用 @Mock 生成的类, 所有方法都不是真实的方法, 而且返回值都是NULL.
  9. * 与之对应的还有个 @Spy
  10. * 使用 @Spy 生成的类, 所有方法都是真实方法, 返回值都是和真实方法一样的
  11. */
  12. @Mock
  13. private ConContractBillDao conContractBillDao;
  14. @Mock
  15. private ConContractBillDetailDao conContractBillDetailDao;
  16. @Test
  17. @PrepareForTest(ContractBillService.class)
  18. public void testConNewSignBill_success() throws Exception {
  19. String contractGuid = "1";
  20. // 这里录制脚本
  21. // 当我们对 @Mock 的类进行模拟方法时, 会像下面这样去做:
  22. // when(userService.loadUserById(any(String.class))).thenReturn(Optional.of(mockUser));
  23. // 当我们对 @Spy 的类进行模拟方法时, 会像下面这样去做:
  24. // doReturn(Optional.of(mockUser)).when(userService).loadUserById(any(String.class));
  25. when(conContractBillDao.deleteAny(any(ConContractBill.class))).thenReturn(1);
  26. when(conContractBillDetailDao.deleteAny(any(ConContractBillDetail.class))).thenReturn(1);
  27. // mock私有方法
  28. ContractBillService spy = PowerMockito.spy(contractBillService);
  29. ReflectionTestUtils.setField(spy, "conContractBillDao", conContractBillDao);
  30. ReflectionTestUtils.setField(spy, "conContractBillDetailDao", conContractBillDetailDao);
  31. doNothing().when(spy, "caleFirstPayBill", any(), any(), any());
  32. doNothing().when(spy, "caleScheduleBill", any(), any(), any(), any());
  33. doNothing().when(spy, "caleDepositBill", any(), any());
  34. // 执行你的逻辑
  35. Response<Void> response = spy.conNewSignBill(contractGuid);
  36. // 断言
  37. assertThat(response.getCode(), is(IResultCode.SUCCESS));
  38. }

其中起主要作用的就是:

  1. ReflectionTestUtils.setField(spy, "conContractBillDao", conContractBillDao);
  2. ReflectionTestUtils.setField(spy, "conContractBillDetailDao", conContractBillDetailDao);

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/274450
推荐阅读
相关标签
  

闽ICP备14008679号