Junit тестирует метод пустого ответа

У меня есть метод void, а именно invokeEllaAsync, который я хотел бы протестировать в экосистеме Spring и который представлен ниже. Метод также вызывает другой метод void изнутри как вложенный вызов.

Насмешливая информация представлена ​​ниже,

   @InjectMocks
    private EllaService ellaService;

    private IrisBo validIrisBo;

    @Mock
    private EllaRequestDto ellaRequestDtoMock;

    @Mock
    private EntityServiceConnectable<EllaResponseDto> connectorMock;

    @Mock
    private EllaResponseDto ellaResponseMock;


    @Async
    public void invokeEllaAsync( final IrisBo irisBo ) throws EllaGatewayUnsuccessfulResponseException {

        try {
            callEllaService( irisBo );
        }

        /**
         * Asynchronously call Ella. Determine if traffic is applicable for Ella and if yes forward to Ella.
         *
         * @param irisEo
         * @return List<ResultBo>
         * @throws EllaGatewayUnsuccessfulResponseException
         */

        catch( EllaGatewayUnsuccessfulResponseException ex ) {
            throw new EllaGatewayUnsuccessfulResponseException( ex.getMessage(), ex.getCause() );
        }
    }

    private void callEllaService( final IrisBo irisBo ) throws EllaGatewayUnsuccessfulResponseException {

        HttpHeaders elladHeaders = createRequestHeaders( irisBo );

        ServiceResponse<EllaResponseDto> response = connector.call( EllaDtoConverter.convertToRequest( irisBo ), elladHeaders );

        if ( !response.isSuccess() ) {
            throw new EllaGatewayUnsuccessfulResponseException( response.getErrorMessage(), response.getException().getCause() );
        }

    }

Я пытаюсь протестировать метод invokeEllaAsync следующим образом:

    @Test
    public void testInvokeEllaShowsSuccess() {

        ServiceResponse<EllaResponseDto> validServiceResponseMock = mock( ServiceResponse.class );

        when( connectorMock.call( any(), (HttpHeaders) any() ) ).thenReturn( validServiceResponseMock );
        when( validServiceResponseMock.isSuccess() ).thenReturn( true );

        ellaService.invokeEllaAsync( validIrisBo );
        verify( ellaService, times( 1 ) ).invokeEllaAsync( validIrisBo );
    }

Я получаю ошибку, указанную ниже,

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type EllaService and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:
    verify(mock).someMethod();
    verify(mock, times(10)).someMethod();
    verify(mock, atLeastOnce()).someMethod();

Если я правильно понимаю, ellaService — это тип @InjectMocks, а не @Mock. Следовательно, тест не выполняется.

Как правильно написать тест?

Нет, ellaService относится к типу EllaService. @InjectMocks означает, что вы вводите в него свои моки. Это не делает его насмешкой. Кроме того, это то, что вы тестируете, поэтому вы не хотите, чтобы это было макетом.

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

Ответы 2

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

Проблема в том, что вы можете проверить только имитированные компоненты (с аннотацией @Mock). EllaService — это не moc, а экземпляр реального класса из вашего кода. Аннотация @ InjectMock просто устанавливает приватные поля EllaService с моками.

Как правило, при тестировании метода void вам необходимо убедиться, что некоторые фиктивные компоненты были вызваны с ожидаемыми параметрами, поэтому вам нужно проверить не вызов ellaService, а вызов фиктивных компонентов, который используется в методе invokeEllaAsync.

Не могли бы вы проверить тест, на который я добавил ответ?

Heisenberg 31.05.2019 12:56

После того, как я прочитал ответ, я добавил этот тест в кодовую базу.

@Test
public void testInvokeEllaAsyncSuccessfullyCallsCallEllaService() {

    ellaService.invokeEllaAsync( validIrisBo );

    PowerMockito.verifyStatic( EllaDtoConverter.class, VerificationModeFactory.times( 1 ) );
    EllaDtoConverter.convertToRequest( validIrisBo );

    verify( connectorMock, times( 1 ) ).call( any(), (HttpHeaders) any() );
}

Вы должны добавить это в свой исходный пост, а не в ответ, он может быть удален администратором.

Bentaye 31.05.2019 12:58

@Арефе отлично выглядит. Насколько я помню, вы можете использовать любой (HttpHeaders.class)

alexey28 31.05.2019 13:00

@ alexey28 Я пробовал, но не работает. Я обновил тест с помощью PowerMock для статического метода. Хотя я частично осознаю, что тестирование методов static не очень хорошо, это конвертер, и он мне понадобится.

Heisenberg 31.05.2019 14:37

Это ответ или код относится к вопросу?

Modus Tollens 31.05.2019 16:05

Это ответ. Я узнал из ответа @alexey28 и создал его позже.

Heisenberg 31.05.2019 17:01

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