You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Kubernetes中运行的Spring Boot任务编写集成测试?

解决方案

核心问题分析

你的测试无法正常执行,根源是@SpringBootTest启动Spring上下文时,会自动触发CommandLineRunner的run方法,提前执行jobStarter.startJob(),此时外部服务BalanceService未被Mock,导致报错;若手动缩小上下文范围(用@ContextConfiguration指定少量类),则会丢失Spring Boot自动配置的数据库相关Bean。

方案1:Mock外部服务并允许启动时执行任务

让应用启动时正常执行任务,但用Mock的BalanceService避免真实调用,测试方法中可重新定义Mock行为覆盖不同场景:

@SpringBootTest
class JobStarterTest {

    @Autowired
    private lateinit var jobStarter: JobStarter

    @Autowired
    private lateinit var productRepository: ProductRepository

    @MockBean // 提前Mock外部服务,上下文启动时就会使用该Mock实例
    private lateinit var balanceService: BalanceService

    @Test
    fun `successful data save when balance service returns valid data`() {
        // 1. 定义Mock行为
        val mockBalance = Balance(name = "test_product", balance = 500.0)
        `when`(balanceService.getBalance()).thenReturn(mockBalance)

        // 2. 执行任务逻辑
        jobStarter.startJob()

        // 3. 断言验证(示例:检查数据库是否保存了正确数据)
        val savedProduct = productRepository.findByName("test_product")
        assertNotNull(savedProduct)
        assertEquals(500.0, savedProduct?.balance)
    }

    @Test
    fun `handle balance service failure gracefully`() {
        // 1. 定义Mock抛出异常的场景
        `when`(balanceService.getBalance()).thenThrow(RuntimeException("External service down"))

        // 2. 执行并验证异常处理逻辑(根据实际错误处理调整断言)
        assertThrows<RuntimeException> {
            jobStarter.startJob()
        }
    }
}

方案2:禁用启动时自动执行任务

若不想让应用启动时执行任务,仅在测试方法中手动触发,可通过配置禁用CommandLineRunner的自动执行:

@SpringBootTest(properties = ["spring.main.command-line-runner.enabled=false"])
class JobStarterTest {

    @Autowired
    private lateinit var jobStarter: JobStarter

    @Autowired
    private lateinit var productRepository: ProductRepository

    @MockBean
    private lateinit var balanceService: BalanceService

    @Test
    fun `successful scenario`() {
        // 定义Mock行为
        val mockBalance = Balance(name = "test", balance = 100.0)
        `when`(balanceService.getBalance()).thenReturn(mockBalance)

        // 手动执行任务
        jobStarter.startJob()

        // 断言验证
        val savedProduct = productRepository.findByName("test")
        assertNotNull(savedProduct)
    }
}

关键说明

  • @SpringBootTest默认会加载src/test/resources下的application.properties,无需额外添加@TestPropertySource(除非测试配置文件名不同),H2数据源、事务管理器等数据库自动配置会直接生效。
  • @MockBean会替换Spring上下文中的真实BalanceService实例,确保所有对该服务的调用都指向Mock对象,避免发起真实外部请求。

内容的提问来源于stack exchange,提问作者Renan Geraldo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:46:16