如何模拟@springboottest 的应用程序配置或上下文?

Posted

技术标签:

【中文标题】如何模拟@springboottest 的应用程序配置或上下文?【英文标题】:How to mock application configuration or context for @springboottest? 【发布时间】:2022-01-23 03:20:15 【问题描述】:

我有一个需要外部连接(数据库、配置服务器、分析服务器)才能启动的应用。

当我运行“@springboottest”时,我不想连接到真实的 url,因此应用程序无法启动以进行测试。解决问题的最佳方法是什么?

有没有办法在应用启动之前提供模拟?

【问题讨论】:

【参考方案1】:

@MockBean 是您正在寻找的。它用于用 Mockito mock 替换 bean。 docs 的一个例子是:

@SpringBootTest
class MyTests 

    @Autowired
    private Reverser reverser;

    @MockBean
    private RemoteService remoteService;

    @Test
    void exampleTest() 
        given(this.remoteService.getValue()).willReturn("spring");
        String reverse = this.reverser.getReverseValue(); // Calls injected RemoteService
        assertThat(reverse).isEqualTo("gnirps");
    


同样使用@SpringBootTest,默认情况下无需进一步配置将加载应用程序中定义的所有bean,这可能对测试来说太多了,因为通常我们只专注于在每个测试中测试一个东西。

因此,如果您不测试控制器层或数据层,很可能您可以将您的测试重写为普通的 Mockito 测试,而无需使用@SpringBootTest。它更简单,运行速度也更快。

如需测试控制器层或数据层,请查看@WebMvcTest@DataJpaTest@JdbcTest @DataJdbcTest等(详见docs)

【讨论】:

以上是关于如何模拟@springboottest 的应用程序配置或上下文?的主要内容,如果未能解决你的问题,请参考以下文章

SpringBootTest - 如何在测试级别断言上下文不加载和更改属性?

使用@SpringBootTest时如何在测试类中自动装配bean

如何在 SpringBootTest 中的 @DataJpaTest 中导入配置类?

如何使用@SpringBootTest 验证作业是不是运行了另一个作业

如何在多个 SpringBootTests 之间重用 Testcontainers?

Kotlin - 如何在 springBootTest 中管理 @BeforeClass 静态方法