es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    @Test
    public void writeIntoCassendraTest() throws Exception {
      String jsonTransaction = "";
      ObjectMapper objectMapper = new ObjectMapper();
      Transaction transaction = objectMapper.readValue(jsonTransaction, Transaction.class);
      loan.writeIntoCassendra(transaction);
    
      // Obtener referencias a los objetos CompletableFuture
      CompletableFuture<void> future1 = Whitebox.getInternalState(loan, "future1");
      CompletableFuture<void> future2 = Whitebox.getInternalState(loan, "future2");
    
      // Asegurarse de la finalización de los objetos CompletableFuture
      future1.join();
      future2.join();
    
      // Realizar las aserciones sobre el objeto de transacción
      // assertThat();
    }
    

    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.

Comments are closed.