Как я могу проверить, что мой асинхронный процесс отправлен правильно? - PullRequest
2 голосов
/ 12 июля 2019

У меня есть конечная точка, и я создал AOP Around, который измеряет время выполнения моей конечной точки и вызывает асинхронную службу, которая будет записывать это время в базе данных.Эта услуга уже проходит независимое тестирование.У меня уже есть интеграционный тест для моей конечной точки, и в конце я хотел бы проверить, действительно ли был вызван мой сервис, который находится в AOP.Как я могу это сделать?

Моя конечная точка:

@PostMapping("/doSomething")
@ResponseStatus(HttpStatus.CREATED)
@AuthorizationTime()                                            <--My AOP
public returnVO createSomething(
    @RequestBody @ApiParam(value = "requestVO") final RequestVO requestVO)
    throws Throwable {

    ResponseVO response = doing1();

    doing2();

    return response;
}

Мой AOP:

@Aspect
@Component
@RequiredArgsConstructor
public class TimeAspect {

    @Autowired
    @Qualifier(SleuthThreadConfig.SLEUTH_TASK_EXECUTOR_BEAN_NAME)
    private AsyncTaskExecutor executor;

    private final TransactionAuthorizationTimeService transactionAuthorizationTimeService;

    @Around("@annotation(AuthorizationTime) && args(requestVO)")
    public Object authorizationTime(ProceedingJoinPoint joinPoint, final RequestVO requestVO) throws Throwable {
        final Instant start = Instant.now();

        final Object proceed = joinPoint.proceed();

        final Instant end = Instant.now();

        final int duration = Duration.between(start, end).getNano();

        CompletableFuture
                .runAsync(() -> transactionAuthorizationTimeService.createAuthorizationTimeEntity(
                        requestVO.getKey(),
                        durationTime)
                    , executor);

        return proceed;
    }
}

Мой тест интеграции:

@Test
public void when_create_success() throws JSONException {


    final var vo = prepareVO; 

    RestAssured.given()
        .body(vo)
        //Act
        .contentType(ContentType.JSON)
        .post("/doSomething")
        .then()
        //Assert
        .statusCode(HttpStatus.SC_CREATED)
        .body(not(isEmptyOrNullString()))
        .body(PATH_RESULT, is(SUCESSO.code))
        .body(PATH_DATE_HOUR, not(isEmptyOrNullString()));

//TODO check if my transactionAuthorizationTimeService.createAuthorizationTimeEntity called

}

1 Ответ

0 голосов
/ 16 июля 2019

Мне удалось решить, используя пример, который опубликовал @ Bond-JavaBond.

Мой тест:

@Autowired
private TimeAspect timeAspect;
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock
private ProceedingJoinPoint proceedingJoinPoint;

@Test
public void when_create_success() throws JSONException {


    final var vo = prepareVO; 

    RestAssured.given()
        .body(vo)
        //Act
        .contentType(ContentType.JSON)
        .post("/doSomething")
        .then()
        //Assert
        .statusCode(HttpStatus.SC_CREATED)
        .body(not(isEmptyOrNullString()))
        .body(PATH_RESULT, is(SUCESSO.code))
        .body(PATH_DATE_HOUR, not(isEmptyOrNullString()));

    timeAspect.authorizationTime(proceedingJoinPoint, vo);
    verify(proceedingJoinPoint, times(1)).proceed();
}
...