有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带Powermock的@Mock(模拟最终静态哈希表)中的java空指针

我有一个应用程序(SpringMVC4+Hibernate/JPA+MySQL+Maven集成示例使用注释),使用基于注释的配置将Spring与Hibernate集成

我有一个控制器:

  public class AndroidBackController {

        protected static final Logger LOGGER = LoggerFactory.getLogger(AndroidBackController.class);

        private static final Hashtable<String, Date> SMS_NOTIFICATION = new Hashtable<String, Date>();

@RequestMapping(value = { "/sigfoxCallBack" }, method = RequestMethod.GET)
    public String performAndroidCallBack(@RequestParam Map<String, String> allRequestParams) throws ClientProtocolException, IOException {

 Date lastsmsSend = SMS_NOTIFICATION.get(deviceEvent.getDevice().getKey());

    ..
    }

and this Test:



  public class AndroidBackControllerTest {

        @InjectMocks
        AndroidBackController 安卓CallBackController;

        @Mock
        DeviceService deviceService;

        @Mock
        DeviceEventService deviceEventService;

        @Mock
        Hashtable<String, Date> SMS_NOTIFICATION = new Hashtable<String, Date>();


        @Mock
        Map<String, String> allRequestParams;

        @BeforeClass
        public void setUp(){
            MockitoAnnotations.initMocks(this);
        }

        @Test
        public void 安卓CallBack() throws ClientProtocolException, IOException {

             PowerMockito.mockStatic(Hashtable.class);

            Device device = new Device();
            DeviceType deviceType = new DeviceType();
            deviceType.setType("SMARTEVERYTHING_KIT");
            device.setDeviceType(deviceType);

            when(allRequestParams.get("devideId")).thenReturn("E506");
            when(allRequestParams.get("rssi")).thenReturn("155.55");
            when(SMS_NOTIFICATION.get("E506")).thenReturn(new Date());


            when(deviceService.findByKey("E506")).thenReturn(device);



            Assert.assertEquals(安卓CallBackController.performAndroidCallBack(allRequestParams), "alldevices");

        }        
    }

但是我有一个java。此行中的lang.NullPointerException:

Date lastsmsSend=SMS\u通知。获取(deviceEvent.getDevice()。getKey())


共 (2) 个答案

  1. # 1 楼答案

    如前所述,Mockito不能将mock注入静态字段(我没有提到final字段,因为PowerMock移除final修饰符)

    您可以使用以下方法绕过限制:

    Whitebox.setInternalState(AndroidBackController.class, "SMS_NOTIFICATION", smsNnotification);
    
  2. # 2 楼答案

    不能使用mockito注入静态变量和最终变量。要么删除这些,要么创建一个真正的价值,而不是一个模型