Substituir propriedades nos testes da primavera

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 arquivoapplicationtest.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.