在运行spring-boot集成测试时如何禁用spring Vault

时间:2019-12-12 20:06:41

标签: spring-test spring-boot-test spring-vault

我最终解决了这个困扰我一整年的问题,正当我要寻求帮助时,所以我将解决方案留给下一个人。

问题是,我无法通过将cloud.vault.enabled设置为false来在测试期间忽略Vault。

@RunWith(SpringRunner.class)
@SpringBootTest(classes=MyApp.class, webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT,  
    properties = {"cloud.vault.enabled: false"})
@ContextConfiguration(classes = MyApp.class)
public class SpringBootRunner {
    @Test
    public void springApplicationContextLoads() {
        assert(true);
    }
}

禁用Vault属性会阻止我遇到的一个错误,但随后又给了我一个错误 没有名为“ vaultTemplate”的bean可用

在应用程序保管库中唯一被使用的位置就是这个配置文件中

@Configuration
@VaultPropertySource(value = "secret/apps/myapp/my-access-key",
        propertyNamePrefix = "my-access-key.")
@VaultPropertySource(value = "secret/apps/myapp/my-secret-key",
  propertyNamePrefix = "my-secret-key.")
public class ElasticsearchClientConfig { ... }

如果我注释掉@VaultPropertySource并进行一些调整,则测试将运行,但这是易于出错的解决方案,它们不会在CI环境中运行。

我终于发现,如果我创建了一个application-test.properties文件,并为@VaultPropertySource寻找的依赖项添加了虚拟值,那么这些测试将最终运行!

#Properties for automated integration tests
cloud.vault.enabled: false
#The keys are provided to that dependency injection doesn't fail
#The values don't matter since we're ignoring vault during test execution
my-access-key.value="foo"
my-secret-key.value="bar"
spring.cloud.vault.token:ROOT_TOKEN_my-app

请注意,我从上述@Configuration类的@VaultPropertySource中为每个 propertyNamePrefix 添加了属性。

之后,我向测试运行器添加了一个测试配置文件,并且一切正常:

@RunWith(SpringRunner.class)
@SpringBootTest(classes=MyApp.class, webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT) //Properties moved to application-test.properties
@ContextConfiguration(classes = MyApp.class)
@ActiveProfiles("test") //<-- THIS PART CHANGED
public class SpringBootRunner {
    @Test
    public void springApplicationContextLoads() {
        assert(true);
    }
}

0 个答案:

没有答案