Java 如何测试异步进程是否正确提交?

Java 如何测试异步进程是否正确提交?,java,asynchronous,integration-testing,spring-aop,junit5,Java,Asynchronous,Integration Testing,Spring Aop,Junit5,我有一个端点,我创建了一个AOP,它将测量端点的执行时间,并调用一个异步服务,该服务将在数据库中记录该时间。 此服务已在进行独立测试。 我已经为我的端点做了一个集成测试,我希望在测试结束时只检查AOP中的服务是否被实际调用。我该怎么做 我的端点: @PostMapping("/doSomething") @ResponseStatus(HttpStatus.CREATED) @AuthorizationTime()

我有一个端点,我创建了一个AOP,它将测量端点的执行时间,并调用一个异步服务,该服务将在数据库中记录该时间。 此服务已在进行独立测试。 我已经为我的端点做了一个集成测试,我希望在测试结束时只检查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;
}
我的集成测试:

@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

}

我能够使用@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();
}

务实地说:记下来!;)一般来说:您可以(尝试启用)模拟CompletableFuture/执行器…我看到您使用Lombok创建构造函数,但我看不到如何将
TransactionAuthorizationTimeService
连接到方面。无论如何,您可以将一个包装器(在测试术语中通常称为spy)连接到集成测试的方面,并确保包装器对感兴趣的方法进行计数或注册调用,然后从您的测试中检查这些方法(异步地,即重复等待或轮询一秒钟左右)。您可以使用
Mockito.verfiy
API系列。谢谢大家。我可以用@Bond JavaBond发布的例子来解决这个问题。谢谢你的提醒!然而,我分享的是@kriegaex帖子。因此,真正的帮助是他而不是我:)谢谢你的提及!然而,这是我分享的帖子。因此,真正的帮助是他而不是我:)
@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();
}