【发布时间】:2022-09-27 22:03:53
【问题描述】:
Spring 6、Quartz 和基于 SimpleTrigger 的计划任务。
@Component
@Slf4j
public class Greeting {
public void sayHello() {
log.debug(\"Hello at {}:\", LocalDateTime.now());
}
}
石英配置:
@Configuration
class QuartzConfig{
@Bean
MethodInvokingJobDetailFactoryBean greetingJobDetailFactoryBean() {
var jobFactory = new MethodInvokingJobDetailFactoryBean();
jobFactory.setTargetBeanName(\"greeting\");
jobFactory.setTargetMethod(\"sayHello\");
return jobFactory;
}
@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean() {
SimpleTriggerFactoryBean simpleTrigger = new SimpleTriggerFactoryBean();
simpleTrigger.setJobDetail(greetingJobDetailFactoryBean().getObject());
simpleTrigger.setStartDelay(1_000);
simpleTrigger.setRepeatInterval(5_000);
return simpleTrigger;
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
var factory = new SchedulerFactoryBean();
factory.setTriggers(
simpleTriggerFactoryBean().getObject(),
cronTriggerFactoryBean().getObject()
);
return factory;
}
我尝试使用等待来检查调用。
@SpringJUnitConfig(value = {
QuartzConfig.class,
Greeting.class
})
public class GreetingTest {
@Autowired
Greeting greeting;
Greeting greetingSpy;
@BeforeEach
public void setUp() {
this.greetingSpy = spy(greeting);
}
@Test
public void whenWaitTenSecond_thenScheduledIsCalledAtLeastTenTimes() {
await()
.atMost(Duration.ofSeconds(10))
.untilAsserted(() -> verify(greetingSpy, atLeast(1)).sayHello());
}
}
运行测试,它失败了。
org.awaitility.core.ConditionTimeoutException: Assertion condition defined as a com.example.demo.GreetingTest
Wanted but not invoked:
greeting.sayHello();
-> at com.example.demo.GreetingTest.lambda$whenWaitTenSecond_thenScheduledIsCalledAtLeastTenTimes$0(GreetingTest.java:36)
Actually, there were zero interactions with this mock.
within 10 seconds.
在jobDetailFactorBean中,我使用jobFactory.setTargetBeanName(\"greeting\");在这里设置目标bean,它应该直接传递Greeting bean。
更新:自己解决了,检查here。
标签: spring mockito awaitility