首页 > 解决方案 > 如何在 Spring 中测试 @Scheduled - 而不是 SpringBoot

问题描述

我发现了这个问题的许多类似主题,但我仍然没有针对我的案例的解决方案。我想在 Spring 5 应用程序中测试我的调度程序并计算它在一段时间内调用的次数。

这是我的调度程序:

@Component
public class CancelVisitScheduler {

    @Scheduled(fixedDelay = 10000, initialDelay = 10000)
    public void execute() {
        // do some things
    }
}

我正在尝试这样的事情:

import org.awaitility.Duration;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.awaitility.Awaitility.await;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

class CancelVisitSchedulerTest {

    @Mock
    private CancelVisitScheduler cancelVisitScheduler;

    @BeforeEach
    void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    void shouldExecuteAfter10Seconds() {
        await().atMost(Duration.ONE_MINUTE).untilAsserted(() -> verify(cancelVisitScheduler, times(4)).execute());
    }
}

但我收到这样的错误:

org.awaitility.core.ConditionTimeoutException: Assertion condition defined as a lambda expression in path....CancelVisitSchedulerTest 
Wanted but not invoked:
cancelVisitScheduler.execute();
-> at path....CancelVisitSchedulerTest.lambda$shouldExecuteAfter10Seconds$0(CancelVisitSchedulerTest.java:25)
Actually, there were zero interactions with this mock.
 within 60 seconds.

我找到的所有答案都是spring boot应用程序,但我需要一个spring的解决方案。有什么简单的选择吗?

标签: javaspringunit-testingjunitscheduled-tasks

解决方案


推荐阅读