Eu tenho um arquivo de recurso que tem algumas configurações. Eu tenho uma classe ResourceLoader que carrega as configurações deste arquivo. Atualmente, esta classe é uma classe singleton instanciada ansiosamente. Assim que essa classe é carregada, ela lê as configurações do arquivo (caminho do arquivo armazenado como um campo constante em outra classe). Algumas dessas configurações não são adequadas para testes de unidade. Por exemplo, eu tenho um tempo de suspensão do encadeamento neste arquivo, que pode levar horas para o código de produção, mas eu gostaria que fosse alguns milissegundos para testes de unidade. Então, eu tenho outro arquivo de recurso de teste que tem um conjunto diferente de valores. Minha pergunta é como faço para trocar o arquivo principal de recursos por esse arquivo de teste durante o teste de unidade? O projeto é um projeto inteligente e estou usando o testng como estrutura de teste. Estas são algumas das abordagens que eu
Use @BeforeSuite e modifique a variável constante FilePath para apontar para o arquivo de teste e use @AfterSuite para apontar de volta para o arquivo original. Isso parece estar funcionando, mas acho que porque a classe ResourceLoader é instantaneamente instanciada, não há garantia de que o método @BeforeSuite sempre seja executado antes do carregamento da classe ResourceLoader e, portanto, propriedades antigas podem ser carregadas antes que o caminho do arquivo seja alterado. Embora a maioria dos compiladores carregue uma classe somente quando necessário, não tenho certeza se esse é um requisito de especificação java. Portanto, em teoria, isso pode não funcionar para todos os compiladores java.
Passe o caminho do arquivo de recursos como um argumento de linha de comando. Posso adicionar o caminho do arquivo de recurso de teste como argumento da linha de comando na configuração infalível no pom. Isso parece um pouco excessivo.
Use a abordagem em 1. e torne o ResourceLoader preguiçoso instanciado. Isso garante que se @BeforeMethod for chamado antes da primeira chamada para ResourceLoader.getInstance (). GetProperty (..), o ResourceLoader carregará o arquivo correto. Isso parece ser melhor do que as duas primeiras abordagens, mas acho que tornar uma classe singleton preguiçosa instancia torna-a feia, pois não posso usar um padrão simples como torná-la uma enumeração e tal (como é o caso da instanciação ansiosa).
Parece um cenário comum, qual é a maneira mais comum de fazer isso?