Я пытаюсь запустить модульный тест для функции ниже
@Autowired
private EmailServiceConfigProperties emailServiceConfigProperties;
@Autowired
private HttpHandler httpHandler;
public TransactionalEmailResponse sendPostRequestForTransactionalEmail(String endpoint, TransactionalEmail emailRequestBody) {
HttpHeaders httpHeaders = setHttpHeaders();
ResponseEntity<TransactionalEmailResponse> response = null;
try {
response = httpHandler.sendPost(endpoint, httpHeaders, emailRequestBody, TransactionalEmailResponse.class);
} catch (Exception e) {
logger.error("An error while sending POST request to email-service : " + JsonUtils.jsonize(emailRequestBody), e);
}
TransactionalEmailResponse body = response.getBody();
return body;
}
Ниже приведен модульный тест того же самого:
@InjectMocks
private APIKeyAuthHandler testAPIKeyAuthHandler;
@Mock
private HttpHandler httpHandler;
@Mock
private EmailServiceConfigProperties emailServiceConfigPropertiesMock;
@Test
public void testSendPostRequestForTransactionalEmail() {
TransactionalEmail transactionalEmail = getTransactionalEmailRequestBody(); //returns POJO
TransactionalEmailResponse transactionalEmailResponse = transcationEmailResponse();
Mockito.doReturn(setHttpHeaders()).when(testAPIKeyAuthHandler).setHttpHeaders(); returns POJO
String sendEmailEndpoint = "https://dev.com/api/v2/send/email";
Mockito.when(httpHandler.sendPost(sendEmailEndpoint, setHttpHeaders(), transactionalEmail, TransactionalEmailResponse.class))
.thenReturn(new ResponseEntity<>(transactionalEmailResponse, HttpStatus.OK));
assertNotNull(testAPIKeyAuthHandler.sendPostRequestForTransactionalEmail(sendEmailEndpoint, transactionalEmail));
}
Ниже приведен лог ошибки:
org.mockito.exceptions.misusing.NotAMockException:
Argument passed to when() is not a mock!
Example of correct stubbing:
doThrow(new RuntimeException()).when(mock).someMethod();
at service.api.handlers.APIKeyAuthHandlerUnitTest.testSendPostRequestForTransactionalEmail(APIKeyAuthHandlerUnitTest.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
Может ли кто-нибудь помочь мне с тем, как исправить то же самое? Спасибо
Здесь:
when(testAPIKeyAuthHandler)
Но:
@InjectMocks
private APIKeyAuthHandler testAPIKeyAuthHandler;
testAPIKeyAuthHandler
является нет макетом, и синтаксис для выполнения спецификации when()
не изменит этого.
Значение: аннотация @InjectMocks нет создает макет. Он создает объект, который Mockito попытается заселять с вашими фиктивными объектами!
Но обратите внимание, ответ настоящий здесь: эти вещи сложны. Вы не можете научиться использовать mockito в сочетании со сложной структурой, такой как Spring, методом проб и ошибок. Таким образом: вам лучше отступить. Подберите хороший учебник по использованию mockito. Прочтите это и понимать, как правильно использовать Mockito. Затем возьмите учебник, который объясняет Mockito в сочетании с Spring, прочитайте его, поймите. И потом примените то, что вы узнали, к своей настройке.