Eu tenho um aplicativo Spring-Boot em que as propriedades padrão são definidas em um application.properties
arquivo no caminho de classe (src / main / resources / application.properties).
Gostaria de substituir algumas configurações padrão no meu teste JUnit por propriedades declaradas em um test.properties
arquivo (src / test / resources / test.properties)
Normalmente, tenho uma classe de configuração dedicada para meus testes Junit, por exemplo
package foo.bar.test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
}
Primeiro pensei que o uso @PropertySource("classpath:test.properties")
na classe TestConfig faria o truque, mas essas propriedades não substituirão as configurações de application.properties (consulte o Documento de Referência do Spring-Boot - 23. Configuração Externalizada ).
Então eu tentei usar -Dspring.config.location=classpath:test.properties
ao invocar o teste. Isso foi bem-sucedido - mas não quero definir essa propriedade do sistema para cada execução de teste. Então eu coloquei no código
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
static {
System.setProperty("spring.config.location", "classpath:test.properties");
}
}
que infelizmente não foi novamente bem sucedido.
Deve haver uma solução simples sobre como substituir as application.properties
configurações nos testes JUnit com as test.properties
que eu devo ter esquecido.
fonte
Respostas:
Você pode usar
@TestPropertySource
para substituir valores emapplication.properties
. Do seu javadoc:Por exemplo:
fonte
@TestPropertySource
pode aceitar umproperties
argumento para substituir algumas propriedades em linha, como, por exemplo@TestPropertySource(properties = "myConf.myProp=valueInTest")
, é útil caso você não queira um arquivo de propriedades totalmente novo.@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
@SpringApplicationConfiguration
já está obsoleto e você deve usar@SpringBootTest
O Spring Boot é carregado automaticamente
src/test/resources/application.properties
, se as seguintes anotações forem usadasEntão, mudar o nome
test.properties
paraapplication.properties
utilizar a configuração automática.[ Atualização: substituindo certas propriedades para teste ]
src/main/resources/application-test.properties
.@ActiveProfiles("test")
.Isso carrega
application.properties
e, em seguida,application-test.properties
propriedades no contexto do aplicativo para o caso de teste, conforme as regras definidas aqui .Demo - https://github.com/mohnish82/so-spring-boot-testprops
fonte
application.properties
arquivos no caminho de classe (umsrc/main/resources
e outrosrc/test/resources
). Quem garante que ambas serão tomadas e qual será a primeira?application-test.properties
emsrc/main/resources
e especificartest
como o perfil ativo no caso de teste.src/test/resources/application.properties
são carregadas durante a fase de teste esrc/main/resources/application.properties
são ignoradas.application-default.properties
e elas serão consideradas porque você está executando automaticamente o perfil "padrão" (se não for declarado outro).Você também pode usar meta-anotações para externalizar a configuração. Por exemplo:
fonte
Outra abordagem adequada para substituir algumas propriedades em seu teste, se você estiver usando
@SpringBootTest
anotação:fonte
SpringBootTest
carregar o arquivo application.properties?TLDR:
Então, o que eu fiz foi ter o padrão
src/main/resources/application.properties
e também umsrc/test/resources/application-default.properties
onde eu substitui algumas configurações para TODOS os meus testes.Toda a história
Encontrei o mesmo problema e até agora não estava usando perfis. Parecia incômodo ter que fazê-lo agora e lembre-se de declarar o perfil - o que pode ser facilmente esquecido.
O truque é aproveitar que um perfil específico
application-<profile>.properties
substitua as configurações no perfil geral. Consulte https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties .fonte
Explicação simples:
Se você é como eu e tem o mesmo
application.properties
emsrc/main/resources
esrc/test/resources
, e está se perguntando por que aapplication.properties
pasta na sua pasta de teste não está substituindo a dosapplication.properties
seus principais recursos, continue lendo ...Se você tem
application.properties
menossrc/main/resources
e o mesmoapplication.properties
abaixosrc/test/resources
, queapplication.properties
é detectado, depende de como você está executando seus testes . A estrutura da pastasrc/main/resources
esrc/test/resources
, é uma convenção arquitetônica do Maven, portanto, se você executar seu teste comomvnw test
ou até mesmogradlew test
, oapplication.properties
insrc/test/resources
será escolhido, pois o caminho de classe de teste precederá o caminho de classe principal . Porém, se você executar seu teste comoRun as JUnit Test
no Elipse / STS, oapplication.properties
insrc/main/resources
será captado, pois o caminho de classe principal precede o caminho de teste .Você pode conferir abrindo o
Run > Run Configurations > JUnit > *your_run_configuration* > Click on "Show Command Line"
.Você verá algo como:
Você vê que \ main vem primeiro e depois \ test ? Certo, é tudo sobre o caminho de classe :-)
Felicidades
fonte
fonte
Se você estiver usando o Spring 5.2.5 e o Spring Boot 2.2.6 e quiser substituir apenas algumas propriedades, em vez de todo o arquivo. Você pode usar a nova anotação: @DynamicPropertySource
fonte
Caso contrário, podemos alterar o nome do configurador de propriedades padrão, definindo a propriedade
spring.config.name=test
e, em seguida, tendo o recurso de caminho de classe da qualsrc/test/test.properties
nossa instância nativaorg.springframework.boot.SpringApplication
será configurada automaticamente a partir deste test.properties separado, ignorando as propriedades do aplicativo;Benefício: configuração automática de testes;
Desvantagem: expor a propriedade "spring.config.name" na camada de IC
ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
fonte
application.properties
não é uma opção para mim, pois quero substituir apenas alguns dos valores de configuração originais no teste.Você também pode criar um arquivo application.properties em src / test / resources em que suas JUnits são gravadas.
fonte