Tengo un archivo de recursos que tiene algunas configuraciones. Tengo una clase ResourceLoader que carga la configuración de este archivo. Esta clase es actualmente una clase singleton instanciada con entusiasmo. Tan pronto como se carga esta clase, lee la configuración del archivo (la ruta del archivo se almacena como un campo constante en otra clase). Algunos de estos ajustes no son adecuados para pruebas unitarias. Por ejemplo, tengo tiempo de suspensión de hebras en este archivo, que puede ser horas para el código de producción, pero me gustaría que sea un par de milisegundos para las pruebas unitarias. Entonces tengo otro archivo de recursos de prueba que tiene un conjunto diferente de valores. Mi pregunta es ¿cómo hago para intercambiar el archivo de recursos principal con este archivo de prueba durante las pruebas unitarias? El proyecto es un proyecto maven y estoy usando testng como marco de prueba. Estos son algunos de los enfoques que yo '
Use @BeforeSuite y modifique la variable constante FilePath para apuntar al archivo de prueba y use @AfterSuite para apuntarlo nuevamente al archivo original. Esto parece estar funcionando, pero creo que debido a que la clase ResourceLoader se instancia con entusiasmo, no hay garantía de que el método @BeforeSuite siempre se ejecute antes de que se cargue la clase ResourceLoader y, por lo tanto, las propiedades antiguas se pueden cargar antes de cambiar la ruta del archivo. Aunque la mayoría de los compiladores cargan una clase solo cuando se requiere, no estoy seguro de si este es un requisito de especificación de Java. Entonces, en teoría, esto puede no funcionar para todos los compiladores de Java.
Pase la ruta del archivo de recursos como un argumento de línea de comando. Puedo agregar la ruta del archivo de recursos de prueba como argumento de línea de comando en la configuración segura en el pom. Esto parece un poco excesivo.
Use el enfoque en 1. y haga que ResourceLoader sea perezoso instanciado. Esto garantiza que si se llama a @BeforeMethod antes de la primera llamada a ResourceLoader.getInstance (). GetProperty (..), ResourceLoader cargará el archivo correcto. Esto parece ser mejor que los primeros 2 enfoques, pero creo que crear una instancia de clase única de perezoso hace que sea feo, ya que no puedo usar un patrón simple como convertirlo en una enumeración y tal (como es el caso de la instanciación ansiosa).
Esto parece un escenario común, ¿cuál es la forma más común de hacerlo?