如何在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
相关产品推荐
相关产品推荐

