#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?