Red de conocimiento informático - Material del sitio web - Cómo probar tareas asincrónicas @Async

Cómo probar tareas asincrónicas @Async

spring3 admite tareas asincrónicas usando la anotación @Async, todos solían lograr esto usando el grupo de subprocesos y otros métodos, spring3 también usa este método, pero es más simple.

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

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.