Модульный тест выдает исключение NullPointerException

#java #spring #spring-boot #junit #junit4

#java #весна #весенняя загрузка #junit #junit4

Вопрос:

Я пытаюсь написать модульный тестовый пример для функции handler.sendRequest(request); . Однако он возвращает исключение нулевого указателя. Когда я печатаю объект запроса в модульном тесте, он возвращает null. Однако я инициализировал объект запроса, не уверенный, почему он выдает исключение нулевого указателя. Что-то не так с объектом данных? Я что-то пропустил? Может кто-нибудь, пожалуйста, помогите? Спасибо!

 public class ServicesHandlerTest {

    @Mock
    private RestTemplate restTemplate;

    @Mock
    private ObjectMapper mapper;

    @Mock
    private AuthHandler AuthHandler;

    @InjectMocks
    ServicesHandler handler;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void testSuccess() throws Exception {
        Data data = new Data();
        data.setRequestId(UUID.randomUUID().toString());  
        data.setRequestedQuantity(10);

        Request request = new Request();
        request.setData(data );

        System.out.println("request = "   request);
        ServicesHandler handler = new ServicesHandler();
        Mockito.when(AuthHandler.requestToken()).thenReturn("randomString");
Mockito.when(msAuthHandler.createAuthorizationBearerHttpHeaders("randomString")).thenReturn(any());
        Mockito.when(restTemplate.postForEntity(anyString(), any(), eq(String.class))).thenReturn(new ResponseEntity<String>(HttpStatus.OK));
        handler.sendRequest(request);
    }
  
  @Component
 public class ServicesHandler extends AbstractHandler {

    @Value("${api.host}")
    private String msApiHost;

    @Value("${base.path}")
    private String BasePath;

    @Autowired
    private AuthHandler authHandler;

    public AuthHandler getAuthHandler() {
        return authHandler;
    }



   public ResponseEntity<String> sendRequest(Request pr) throws Exception {
    
   ResponseEntity<String> response = null;

        try {
            String requestToken = getAuthHandler().requestToken();

            HttpHeaders headers = getAuthHandler().createAuthorizationBearerHttpHeaders(requestToken);
            
            String apiUrl = ApiHost   BasePath;

            RestTemplate restTemplate = new RestTemplate();
            MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setSerializationInclusion(Include.NON_NULL);
            mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
            restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter);

        HttpEntity<Request> request = new HttpEntity<Request>(pr, headers);
            response = restTemplate.postForEntity(apiUrl, request, String.class);
        } catch (HttpStatusCodeException e) {
            logger.error("Error when sending for provisioning "   e.getResponseBodyAsString(), e);
            return ResponseEntity.status(e.getStatusCode()).body(e.getResponseBodyAsString());
        } catch (Exception e) {
            throw e;
        }

        return response;
   }
 }
  
 public class Data {
    private String requestId;
    private Integer requestedQuantity;

    public String getRequestId() {
        return requestId;
    }

    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    public Integer getRequestedQuantity() {
        return requestedQuantity;
    }

    public void setRequestedQuantity(Integer requestedQuantity) {
        this.requestedQuantity = requestedQuantity;
    }
}

  

Это дает мне ошибку в getAuthHandler().requestToken(); функции внутри handler.sendRequest(request);

Ниже приведена трассировка стека:

 java.lang.NullPointerException at com.xyz.abc.sendRequest(ServicesHandler.java:443) at com.xyz.abc.ServicesHandlerTest.testSuccess(ServicesHandlerTest.java:150) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498)
  

Комментарии:

1. Вы создаете макеты, создаете новый экземпляр обработчика, но не вводите макеты в обработчик.

2. @M.Deinum Спасибо за ваш ответ. Не могли бы вы помочь мне понять, как вводить макет в справку обработчика или как я могу это сделать?

3. После использования @InjectMocks все та же ошибка. Пожалуйста, помогите мне исправить то, чего не хватает.

4. Пожалуйста, добавьте stacktrace к вашему вопросу.

5. java.lang. Исключение NullPointerException в com.xyz.abc.sendRequest(ServicesHandler.java:443) в com.xyz.abc.ServicesHandlerTest.testSuccess(ServicesHandlerTest.java:150) в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java :62)в sun.reflect. Делегирование methodaccessorimpl.invoke(делегирование methodaccessorimpl.java:43) в java.lang.reflect. Метод.invoke(Метод.java:498)

Ответ №1:

Вы должны внедрить mocks в ServicesHandler using @InjectMocks , см. Документы для получения дополнительной информации MockitoAnnotations.initMocks

 public class ServicesHandlerTest {

    @InjectMocks
    private ServicesHandler;

    @Mock
    private RestTemplate restTemplate;

    @Mock
    private ObjectMapper mapper;

    @Mock
    private AuthHandler AuthHandler;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void testSuccess() throws Exception {
         Data data = new Data();
         data.setRequestId(UUID.randomUUID().toString());  
         data.setRequestedQuantity(10);

         Request request = new Request();
         request.setData(data );

         System.out.println("request = "   request);
    
    
   Mockito.when(AuthHandler.requestToken()).thenReturn("randomString");
    Mockito.when(restTemplate.postForEntity(anyString(), any(), eq(String.class))).thenReturn(new ResponseEntity<String>(HttpStatus.OK));
    handler.sendRequest(request);
   }
}
  

Комментарии:

1. Спасибо за вашу помощь! Однако я попробовал @Injectmocks, он по-прежнему выдает исключение нулевого указателя. Не могли бы вы помочь мне, если я что-то пропустил.

2. Я что-то пропустил с RequestToken?

3. Вы забыли использовать runner, например @RunWith(MockitoJUnitRunner.class )

4. @Milgo я добавил @RunWith(MockitoJunitRunner.class) все ту же ошибку.

5. @Milgo Просто любопытно узнать. Зачем добавлять runner?