Substituir propriedades nos testes da primavera
1. Visão geral
Neste tutorial, daremos uma olhada em várias maneiras de substituir propriedades nos testes do Spring.
Na verdade, o Spring fornece várias soluções para isso, por isso temos muito a explorar aqui.
2. Dependências
Obviamente, para trabalhar com os testes do Spring, precisamos adicionar uma dependência de teste:
org.springframework.boot
spring-boot-starter-test
2.1.6.RELEASE
test
A dependênciaspring-boot-starter-test contém tudo o que precisamos para substituir o valor da propriedade nos testes.
3. Configuração
Primeiro, teremos que criar uma classe no aplicativo que usará nossas propriedades:
@Component
public class PropertySourceResolver {
@Value("${example.firstProperty}") private String firstProperty;
@Value("${example.secondProperty}") private String secondProperty;
public String getFirstProperty() {
return firstProperty;
}
public String getSecondProperty() {
return secondProperty;
}
}
A seguir, vamos atribuir valores a eles. Podemos fazer isso criandoapplication.properties nosrc/main/resources:
example.firstProperty=defaultFirst
example.secondProperty=defaultSecond
4. Substituindo um arquivo de propriedades
Agora, vamos substituir as propriedades, colocando o arquivo de propriedades nos recursos de teste. This file must beon the same classpath como o padrão.
Além disso, devecontain all the property keys especificado no arquivo padrão. Portanto, vamos adicionar o arquivoapplication.properties emsrc/test/java/resources:
example.firstProperty=file
example.secondProperty=file
Vamos também adicionar o teste que fará uso de nossa solução:
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestResourcePropertySourceResolverIntegrationTest {
@Autowired private PropertySourceResolver propertySourceResolver;
@Test
public void shouldTestResourceFile_overridePropertyValues() {
String firstProperty = propertySourceResolver.getFirstProperty();
String secondProperty = propertySourceResolver.getSecondProperty();
assertEquals("file", firstProperty);
assertEquals("file", secondProperty);
}
}
Este método é muito eficaz quando queremos substituir várias propriedades do arquivo.
E, se não colocássemosexample.secondProperty no arquivo, o contexto do aplicativo não descobriria essa propriedade.
5. Perfis de molas
Nesta seção, aprenderemos como lidar com nosso problema usando perfis do Spring. Unlike the previous method,this one merges properties from the default file and the profiled file.
Primeiro, vamos criar um arquivoapplication–test.properties nosrc/test/java/resources:
example.firstProperty=profile
Depois disso, criaremos um teste que usará o perfiltest:
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class ProfilePropertySourceResolverIntegrationTest {
@Autowired private PropertySourceResolver propertySourceResolver;
@Test
public void shouldProfiledProperty_overridePropertyValues() {
String firstProperty = propertySourceResolver.getFirstProperty();
String secondProperty = propertySourceResolver.getSecondProperty();
assertEquals("profile", firstProperty);
assertEquals("defaultSecond", secondProperty);
}
}
Essa abordagem nos permite usar os valores padrão e de teste. Portanto, este é um ótimo método quando precisamosoverride multiple properties from a file but we still want to use the default alguns.
Além disso, podemos aprender mais sobre perfis Spring em nosso tutorialSpring Profiles.
6. @SpringBootTest
Outra maneira de substituir o valor da propriedade é usar a anotação@SpringBootTest:
@RunWith(SpringRunner.class)
@SpringBootTest(properties = { "example.firstProperty=annotation" })
public class SpringBootPropertySourceResolverIntegrationTest {
@Autowired private PropertySourceResolver propertySourceResolver;
@Test
public void shouldSpringBootTestAnnotation_overridePropertyValues() {
String firstProperty = propertySourceResolver.getFirstProperty();
String secondProperty = propertySourceResolver.getSecondProperty();
Assert.assertEquals("annotation", firstProperty);
Assert.assertEquals("defaultSecond", secondProperty);
}
}
As we can see,the example.firstProperty has been overridden while the example.secondProperty hasn’t been. Portanto, essa é uma ótima solução quando precisamos substituir apenas propriedades específicas para o teste. Este é o único método que requer o uso do Spring Boot.
7. TestPropertySourceUtils
Nesta seção, aprenderemos como substituir propriedades usando a classeTestPropertySourceUtils na classeApplicationContextInitializer.
OTestPropertySourceUtils vem com dois métodos que podemos usar para definir um valor de propriedade diferente.
Vamos criar uma classe de inicializador que usaremos em nosso teste:
public class PropertyOverrideContextInitializer
implements ApplicationContextInitializer {
static final String PROPERTY_FIRST_VALUE = "contextClass";
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
configurableApplicationContext, "example.firstProperty=" + PROPERTY_FIRST_VALUE);
TestPropertySourceUtils.addPropertiesFilesToEnvironment(
configurableApplicationContext, "context-override-application.properties");
}
}
A seguir, vamos adicionar o arquivocontext-override-application.properties emsrc/test/resources:
example.secondProperty=contextFile
Por fim, devemos criar uma classe de teste que usará nosso inicializador:
@RunWith(SpringRunner.class)
@ContextConfiguration(
initializers = PropertyOverrideContextInitializer.class,
classes = Application.class)
public class ContextPropertySourceResolverIntegrationTest {
@Autowired private PropertySourceResolver propertySourceResolver;
@Test
public void shouldContext_overridePropertyValues() {
final String firstProperty = propertySourceResolver.getFirstProperty();
final String secondProperty = propertySourceResolver.getSecondProperty();
assertEquals(PropertyOverrideContextInitializer.PROPERTY_FIRST_VALUE, firstProperty);
assertEquals("contextFile", secondProperty);
}
}
Oexample.firstProperty foi substituído pelo método embutido.
Oexample.secondProperty foi sobrescrito do arquivo específico no segundo método. Essa abordagem nos permite definir diferentes valores de propriedade ao inicializar o contexto.
8. Conclusão
Neste tutorial, nos concentramos nas várias maneiras que podemos usar para substituir propriedades em nossos testes.
Também descobrimos quando usar cada solução ou, em alguns casos, quando combiná-las.
Obviamente, também temosthe @TestPropertySource annotation à nossa disposição.
Como sempre, o código para exemplos está disponívelover on GitHub.