Cómo probar tareas asincrónicas @Async
Está implementado en el método interceptor org.springframework.aop.interceptor.AsyncExecutionInterceptor. Parte del código de su método de invocación es el siguiente:
Código Java
<. p> Future&? lt;? > resultado = determineAsyncExecutor(specificMethod).submit(new Callable
llamada de objeto público() lanza una excepción {
intentar {
Resultado del objeto = invocación.proceed();
if (resultado de la instancia del Futuro) {
retorno ((Futuro > ) resultado ).get();
}
}
catch (tirable ex) {
ReflectionUtils.rethrowException(ex)
}
Devuelve n.
Devuelve nulo
}
}); >
Es decir, es sencillo enviar llamadas a la tarea actual al grupo de subprocesos.
1. Probar tareas asincrónicas sin transacciones
Esto es relativamente simple:
1.1 Establezca el valor de retorno de la tarea en Futuro:
Código Java
public Future sendSystemMessage(Long[] ReceiverIds, Message message
1.2, llame a Future.get(); espere a que se complete la tarea.
Código Java
Futuro futuro = messageApi.sendSystemMessage(userIds, message
future.get()
Esto es; muy sencillo.
2. Probar una tarea asincrónica con una transacción
Debido a que es una transacción, la tarea asincrónica debe iniciar un hilo para ejecutar la tarea, por lo que no se puede revertir en el archivo principal. hilo, lo que hace que los datos se envíen a la base de datos, esto definitivamente no es posible en las pruebas de integración; la solución es eliminar la tarea asincrónica:
2.1. impulsado por anotaciones> en el entorno de prueba.
2.2 Utilice la herramienta que proporcioné para eliminar el soporte asincrónico en la prueba:
Código Java
//Eliminar el soporte asincrónico
if(AopProxyUtils.isAsync(messageApi)){
AopProxyUtils.
La clase de prueba se puede encontrar en MessageApiServiceIT.java
Descarga de herramientas AopProxyUtils.java p >
3. Pruebas a nivel de paquete
Código Java
@Async
public void sendSystemMessage() {
sendSystemMessageInner () ;
}
void sendSystemMessageInner() {
}
De esta manera, can Pruebas a nivel de paquete del método sendSystemMessageInner
De hecho, un mejor enfoque es hacer que Spring proporcione soporte interno para probar llamadas asincrónicas similares.