JAVA: аргумент JUNIT, переданный в when(), не является макетом

Я пытаюсь запустить модульный тест для функции ниже


    @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)

Может ли кто-нибудь помочь мне с тем, как исправить то же самое? Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь:

when(testAPIKeyAuthHandler)

Но:

@InjectMocks
private APIKeyAuthHandler testAPIKeyAuthHandler;

testAPIKeyAuthHandler является нет макетом, и синтаксис для выполнения спецификации when() не изменит этого.

Значение: аннотация @InjectMocks нет создает макет. Он создает объект, который Mockito попытается заселять с вашими фиктивными объектами!

Но обратите внимание, ответ настоящий здесь: эти вещи сложны. Вы не можете научиться использовать mockito в сочетании со сложной структурой, такой как Spring, методом проб и ошибок. Таким образом: вам лучше отступить. Подберите хороший учебник по использованию mockito. Прочтите это и понимать, как правильно использовать Mockito. Затем возьмите учебник, который объясняет Mockito в сочетании с Spring, прочитайте его, поймите. И потом примените то, что вы узнали, к своей настройке.

Другие вопросы по теме