Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

2.3K
Vistas
Pruebe una función @Scheduled en Spring-boot con la propiedad cron

Me gustaría probar si mi trabajo Cron se ejecutará en el momento dado (1 de enero a las 00:00 de cada año). ¿Hay alguna manera de probar esto? Desafortunadamente, todos los ejemplos que pude encontrar en línea se refieren a trabajos que se ejecutarán después de un período fijo, por ejemplo, los 5 segundos ( https://www.baeldung.com/spring-testing-scheduled-annotation ).

 @Scheduled(cron = " 0 0 1 1 *") public void myFunc() { do something }
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Bueno, si realmente quieres probar la ejecución, tendrás que pasar la víspera de año nuevo monitoreando la aplicación ;<)

Si desea probar que la programación se ha configurado correctamente y que su tarea está programada, puede autoconectar el ScheduledStaskHolder y consultarlo para su tarea. Suponiendo esta implementación:

 package nl.benooms.scheduledannotationplayground; @Service public class FixedDateSchedule { @Scheduled(cron = "0 0 0 1 1 *") public void OnceAYearCron() { System.out.println("yearly"); } }

Entonces la prueba podría ser:

 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) class FixedDateScheduleTest { @Autowired private ScheduledTaskHolder scheduledTaskHolder; @Test public void testYearlyCronTaskScheduled() { Set<ScheduledTask> scheduledTasks = scheduledTaskHolder.getScheduledTasks(); scheduledTasks.forEach(scheduledTask -> scheduledTask.getTask().getRunnable().getClass().getDeclaredMethods()); long count = scheduledTasks.stream() .filter(scheduledTask -> scheduledTask.getTask() instanceof CronTask) .map(scheduledTask -> (CronTask) scheduledTask.getTask()) .filter(cronTask -> cronTask.getExpression().equals("0 0 0 1 1 *") && cronTask.toString().equals("nl.benooms.scheduledannotationplayground.FixedDateSchedule.OnceAYearCron")) .count(); assertThat(count).isEqualTo(1L); } }

La prueba fallará si:

  • @Scheduled o @EnableScheduling no está configurado
  • la expresión cron no es exacta
  • el nombre de la clase y el método no se corresponden Tenga en cuenta que formatearía la prueba en un formato más legible si no fuera una muestra
over 4 years ago · Santiago Trujillo Denunciar

0

Piense en lo que realmente quiere probar.

  1. Creo que no debería probar si @Scheduled está haciendo lo que debe hacer. Esta prueba debe ser parte del marco de Spring y no debería preocuparse por probar el marco.

  2. Si aplica @Scheduled correctamente, podría ser una prueba significativa y la respuesta de Ben Ooms proporciona una solución. Sin embargo, es muy probable que lo hayas aplicado correctamente y una vez que ejecutes tu aplicación en modo dev, es muy probable que veas si funciona o no.

  3. Pruebas más importantes si su especificación cron está modelando correctamente las necesidades del dominio .

    a) Es más importante desde mi percepción, porque es fácil estropearlo, porque no tiene una notación explícita para cada valor y es diferente de los trabajos cron de UNIX. Una prueba podría tomar el valor de anotación especificado y verificar si modela los requisitos del dominio, es decir, que su 0 0 1 1 * -String significa que se executed at 1 January 00:00 of each year .

    b) Otro enfoque para probar esto puede ser manipular el Clock durante una prueba para establecerlo explícitamente en el tiempo esperado y ver si el programador activa el método. Sin embargo, es posible que esto no abarque todos los casos, especialmente los falsos positivos (es decir, el programador puede activarse en el momento esperado, pero también puede activarse en otros momentos en los que no debería).

  4. Más importante : probar que el método programado realmente hace lo que debería . Esta puede ser una prueba unitaria simple, pero podría implicar pruebas de integración según los requisitos del dominio. La prueba de unidad es completamente independiente de la mecánica de programación y, por lo tanto, se puede implementar como cualquier otra prueba de unidad (por ejemplo, usando un corredor de mockito).

Creo que 3) podría ser crítico o no tan importante según el caso de uso, mientras que 4) siempre es muy importante . Por lo tanto, ambos probablemente deberían ser parte de la estrategia de prueba. Por otro lado, 1) no debe probarse y 2) es agradable, pero probablemente sea más de ingeniería de la prueba.

over 4 years ago · Santiago Trujillo Denunciar

0

Estaba tratando de hacer exactamente lo que sugirió Ben Ooms y no estaba funcionando para mí.

No había configurado mis tareas programadas usando la anotación, había implementado una solución para programarlas usando un "TaskScheduler" autocableado y no pude encontrar mis tareas programadas en ScheduledTaskHolder, aunque estaba funcionando.

Resulta que tuve que declarar un Bean como:

 @Configuration class SchedulerConfiguration { @Bean fun threadPoolTaskScheduler(): TaskScheduler { val scheduler = ThreadPoolTaskScheduler() scheduler.poolSize = 20 return scheduler } }

Y programar mis tareas usando una interfaz: SchedulingConfigurer :

 class MySchedulers( private val myService: MyService, @Qualifier("threadPoolTaskScheduler") private val threadPoolTaskScheduler: TaskScheduler ) : SchedulingConfigurer { private val logger = Logger(this::class.java) private val cronExpression = "0 0 10 * * *" override fun configureTasks(taskRegistrar: ScheduledTaskRegistrar) { taskRegistrar.setTaskScheduler(threadPoolTaskScheduler) logger.info("Setting scheduler cron=$cronExpression") taskRegistrar.addCronTask(CronTask({ runMyTask() }, CronTrigger(cronExpression))) } } private fun runMyTask() { myService.update() } }

Y luego pude encontrar con éxito mis tareas programadas usando ScheduledTaskHolder como lo sugirió Ben Ooms.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda