Junit para CompletableFuture.runAsync()
Me gustaría agradecer a cada uno de ustedes por compartir su conocimiento y tiempo con todos nosotros. Aquí, me gustaría saber cómo podemos escribir casos de prueba junit para una lógica de negocio escrita dentro de CompletableFuture.runAsync()
Por ejemplo:
public class Loan{
public Transaction writeIntoCassandra(Transaction transaction){
private startTime = System.currentTimeMillis();
CompletableFuture.runAsync(()-> {
try{
writeIntoCassandraTable(transaction);
}
catch(JsonConversionException e){
}
});
CompletableFuture.runAsync(()-> {
try{
writeIntoCassandraTable2(transaction);
}
catch(JsonConversionException e){
}
});
return transaction;
}
}
Estoy escribiendo un caso de prueba junit para la implementación anterior
@InjectMocks
private Loan loan;
public void writeIntoCassendraTest(){
String jsonTransaction = "";
ObjectMapper objectMapper = new ObjectMapper();
Transaction transaction = objectMapper.readValue(jsonTransaction, Transaction.class);
loan.writeIntoCassendra(transaction);
//assertThat();
}
Aquí, cuando ejecuto junits, no se ejecuta el código escrito después de “CompletableFuture.runAsync(() -> {” , es decir, los métodos privados writeIntoCassandraTable (transaction) y writeIntoCassandraTable2 (transaction) no se ejecutan. He puesto un punto de interrupción dentro del bloque try pero el control no se detiene en este punto.
Lo cual resulta en una baja cobertura de código. Ayúdame a entender por qué no se ejecuta y cómo se puede arreglar. Háganme saber si necesitan más claridad o detalles.
davy.ai
Para probar la lógica de negocio escrita dentro de CompletableFuture.runAsync(), podemos utilizar el método CompletableFuture.join(). Este método bloquea hasta que el Future completa su ejecución y devuelve el resultado. En nuestro caso, podemos obtener una referencia a los objetos CompletableFuture devueltos de la ejecución de los métodos writeIntoCassandraTable(transaction) y writeIntoCassandraTable2(transaction), y luego unirnos a ellos para asegurarnos de su finalización antes de continuar con las aserciones.
Aquí hay un ejemplo de cómo modificar el caso de prueba JUnit para lograr esto:
En el código anterior, hacemos uso de la clase de utilidad Whitebox de la biblioteca Mockito para obtener referencias a los objetos privados CompletableFuture. Luego usamos el método join() para asegurar su finalización antes de continuar con las aserciones.
Tenga en cuenta que CompletableFuture.runAsync() devuelve un objeto CompletableFuture, por lo que no podemos obtener el resultado de su ejecución. Si necesitamos obtener el resultado, deberíamos usar CompletableFuture.supplyAsync() en su lugar, que devuelve un objeto CompletableFuture.