Написание интеграционного теста для сервиса - PullRequest
0 голосов
/ 29 июня 2019

У меня есть класс обслуживания, который я хотел бы выполнить интеграционным тестом (whitebox). Код метода,

   @Async( ELLA_THREAD_POOL_EXECUTOR_NAME )
    public void invokeEllaAsync( final IrisBo irisBo ) {

        if( isTrafficAllowed( irisBo ) ) {
            callEllaService( irisBo );
        }
    }

    public void callEllaService( final IrisBo irisBo ) {

        HttpHeaders ellaHeaders = createRequestHeaders( irisBo );

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

        if( !response.isSuccess() ) {
            LOG.error( "ERROR", response, irisBo );
        }
    }

Метод, который проверяется ниже,

@Test
public void testCallEllaServiceIsSuccessful() throws IOException {

    String emailAgeResponseJson = readFile( ELLA_RESPONSE_FILE );

    wireMockRule.stubFor( post( urlEqualTo( ELLA_ENDPOINT ) ).willReturn( okJson( emailAgeResponseJson ) ) );

    TestRequestInformation testRequestInformation = new TestRequestInformation();
    IrisBo irisBo = EllaTestDataProvider.createValidIrisBoWithoutRequest();


    service.callEllaService( irisBo );


}

Я хотел бы проверить данные ответа. Метод invokeEllaAsync возвращает void. Ответ находится внутри метода callEllaService.

Как проверить данные ответа?

1 Ответ

0 голосов
/ 29 июня 2019

Прежде всего, быстрый поиск в Google показывает этот вопрос .Поскольку я не на 100% говорю о Spring, я не предлагаю рассматривать это как дублирование.

Теперь я предоставлю несколько дополнительных приемов, если предположить, что мы говорим оМетоды Spring Async (интеграционный тест, вероятно, выполняется с SpringRunner)

Чтобы начать с основ, в двух словах, методы @Async выполняются в другом пуле потоков.Технически это делается путем генерации прокси во время выполнения.Таким образом, есть много методов (вне моей головы, поскольку я действительно не использовал их), которые могли бы помочь:

Вариант 1

Отключить поддержку асинхронного тестирования,Это может быть сделано путем создания некоторого условия в вашем пользовательском классе конфигурации, который включит асинхронную поддержку.Примерно так:

 @Configuration
 @EnableAsync
 @ConditionalOnProperty(name = "async.support.enabled", havingValue = true)
 public class MyAsyncEnablerConfiguration {

 }

Для тестов создайте переменную false

Опция 2

Если это метод на контроллере и выиспользовать тестирование mockMvc (опять же, только мои предположения, я не знаю, где на самом деле код), вы можете воспользоваться asyncDispatch методом, который будет заботиться об асинхронных запросах.

Это выглядит так:

mockMvc.perform(asyncDispatch(mvcResult)) // <-- Note this call
                    .andExpect(status().isOk())
                ...

Полный пример можно найти Здесь

Опция 3

Обратите внимание, что тип возвращаемого значения @Async метод не должен быть void.Это может быть Future или даже AsyncResult пружины.Так что если это будущее - вы можете позвонить future.get() в коде и получить результат.

Чтобы прочитать о типах возвращаемых результатов, проверьте Это руководство

...