如何在spring-boot应用程序中测试@Scheduled作业任务?
package com.myco.tasks;
public class MyTask {
@Scheduled(fixedRate=1000)
public void work() {
// task execution logic
}
}发布于 2018-04-20 06:13:06
如果我们假设您的作业以很小的间隔运行,您确实希望您的测试等待作业执行,并且您只想测试作业是否被调用,您可以使用以下解决方案:
将Awaitility添加到类路径:
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>编写类似以下内容的测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@SpyBean
private MyTask myTask;
@Test
public void jobRuns() {
await().atMost(Duration.FIVE_SECONDS)
.untilAsserted(() -> verify(myTask, times(1)).work());
}
}发布于 2019-01-18 03:34:02
我的问题是:“你想测试什么?”
如果你的回答是“我想知道Spring在我想要的时候运行我的预定任务”,那么你是在测试Spring,而不是你的代码。这不是你需要进行单元测试的东西。
如果你的答案是“我想知道我的任务配置是否正确”,那么用一个经常运行的任务编写一个测试应用程序,并验证该任务是否在你期望的时间运行。这不是单元测试,但将显示您知道如何正确配置任务。
如果答案是“我想知道我编写的任务是否正确运行”,那么您需要对任务方法进行单元测试。在您的示例中,您希望对work()方法进行单元测试。为此,可以编写一个直接调用任务方法(work())的单元测试。例如,
public class TestMyTask
{
@InjectMocks
private MyTask classToTest;
// Declare any mocks you need.
@Mock
private Blammy mockBlammy;
@Before
public void preTestSetup()
{
MockitoAnnotations.initMocks(this);
... any other setup you need.
}
@Test
public void work_success()
{
... setup for the test.
classToTest.work();
.. asserts to verify that the work method functioned correctly.
}发布于 2015-09-01 05:01:24
这通常是很困难的。您可以考虑在测试期间加载Spring上下文,并从其中伪造一些bean,以便能够验证计划的调用。
I have such example in my Github repo.使用所描述的方法测试了一个简单的预定示例。
https://stackoverflow.com/questions/32319640
复制相似问题