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

如何在SpringBoot应用JUnit测试中避免连接Azure Active Directory

如何在JUnit测试中隔离SpringBoot应用与Azure Active Directory的连接

你的AzureCredentials类实现了Azure SDK的AppConfigurationCredentialProvider和KeyVaultCredentialProvider接口,Spring Boot整合Azure App Config/Key Vault时会自动扫描并使用这些实现类,这就是所谓的“隐式调用”。要让JUnit测试完全不依赖真实Azure服务,可通过以下几种方案实现:

方案一:替换CredentialProvider Bean

核心思路是在测试环境中,用不会发起真实请求的Mock实现替换掉真实的AzureCredentials,让Spring容器优先使用测试Bean。

方式1:自定义Mock CredentialProvider

先编写一个测试用的CredentialProvider,返回伪造的TokenCredential:

public class MockAzureCredentials implements AppConfigurationCredentialProvider, KeyVaultCredentialProvider {
    @Override
    public TokenCredential getKeyVaultCredential(String uri) {
        return mockTokenCredential();
    }

    @Override
    public TokenCredential getAppConfigCredential(String uri) {
        return mockTokenCredential();
    }

    private TokenCredential mockTokenCredential() {
        return new TokenCredential() {
            @Override
            public Mono<AccessToken> getToken(TokenRequestContext requestContext) {
                // 返回有效期24小时的伪造AccessToken
                return Mono.just(new AccessToken("fake-valid-token", Instant.now().plus(Duration.ofHours(24))));
            }

            @Override
            public AccessToken getTokenSync(TokenRequestContext requestContext) {
                return new AccessToken("fake-valid-token", Instant.now().plus(Duration.ofHours(24)));
            }
        };
    }
}

然后在测试类中通过@TestConfiguration注册这个Bean,覆盖真实实现:

@SpringBootTest
public class YourApplicationTest {

    @TestConfiguration
    static class TestConfig {
        @Bean
        public AppConfigurationCredentialProvider appConfigCredentialProvider() {
            return new MockAzureCredentials();
        }

        @Bean
        public KeyVaultCredentialProvider keyVaultCredentialProvider() {
            return new MockAzureCredentials();
        }
    }

    // 编写你的测试逻辑
}

方式2:用Mockito直接Mock AzureCredentials

如果不想自定义Mock类,可直接用Mockito模拟AzureCredentials的行为:

@SpringBootTest
public class YourApplicationTest {

    @MockBean
    private AzureCredentials azureCredentials;

    @BeforeEach
    void setUp() {
        // 模拟TokenCredential,返回伪造的AccessToken
        TokenCredential mockToken = mock(TokenCredential.class);
        when(mockToken.getToken(any(TokenRequestContext.class)))
                .thenReturn(Mono.just(new AccessToken("fake-token", Instant.now().plus(Duration.ofHours(24)))));
        when(mockToken.getTokenSync(any(TokenRequestContext.class)))
                .thenReturn(new AccessToken("fake-token", Instant.now().plus(Duration.ofHours(24))));

        // 让AzureCredentials的两个方法返回模拟的TokenCredential
        when(azureCredentials.getKeyVaultCredential(anyString())).thenReturn(mockToken);
        when(azureCredentials.getAppConfigCredential(anyString())).thenReturn(mockToken);
    }

    // 编写你的测试逻辑
}

方案二:禁用Azure相关自动配置

如果你的测试不需要验证Azure配置加载逻辑,可直接禁用Spring Boot的Azure自动配置类,避免初始化Azure客户端:

@SpringBootTest(exclude = {
        AzureAppConfigurationAutoConfiguration.class,
        AzureKeyVaultAutoConfiguration.class
        // 根据你的依赖添加其他Azure自动配置类
})
public class YourApplicationTest {
    // 编写你的测试逻辑
}

为什么虚拟连接字符串无效?

即使使用虚拟连接字符串,Azure SDK客户端仍会尝试验证凭证或连接指定端点,因此还是会发起真实请求。上述方案从根源上替换了凭证提供者或禁用了Azure客户端初始化,完全避免了与Azure服务的交互。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:55:36