Tengo una clase SpringBootApplication que tiene un método @PostConstruct como ese (inicializa el tipo de conexión de la base de datos):
@SpringBootApplication public class SpringBootApp extends WebMvcConfigurerAdapter { public static boolean workOffline = false; private boolean setupSchema = false; private IGraphService graphService; private DbC conf; @Autowired public SpringBootApp(IGraphService graphService, DbC conf) { this.graphService = graphService; this.conf = conf; } public static void main(String[] args) throws Exception { SpringApplication.run(SpringBootApp.class, args); } @PostConstruct public void initializeDB() { if (workOffline) { conf.setupOfflineEnvironment(); return; } else { conf.setupProdEnvironment(); } if (setupSchema) { graphService.setupTestUsers(); } } } También estoy usando Spring Boot Tests que extend esta clase base:
@RunWith(SpringRunner.class) @Ignore @SpringBootTest public class BaseTest { @Before public void beforeTest() { if (SpringBootApp.workOffline) { conf.setupOfflineEnvironment(); } else { conf.setupTestEnvironment(); } graphService.setupTestUsers();} @After public void afterTest() { graphService.deleteAllData(); } } Mis pruebas están bajo tests/ mientras que mi código fuente está bajo src/
Desafortunadamente, hay casos en los que beforeTest() se ejecutará antes @PostConstuct y hay casos en los que se ejecutará después. ¿Hay alguna manera de hacer que mis pruebas se ejecuten con @SprinbBootTest sin ingresar/construir la clase SpringBootApp ?
¡Gracias!
Según lo solicitado, aquí hay un intento de usar las propiedades de resorte (sin un IDE a mano, así que perdone cualquier error)
Puede establecer una propiedad para su prueba usando SpringBootTest#properties
@RunWith(SpringRunner.class) @Ignore @SpringBootTest(properties="springBootApp.workOffline=true") public class BaseTest { @Before public void beforeTest() { /* setup */ } @After public void afterTest() { /* teardown */ } }Ahora que sabemos que podemos configurar la propiedad spring en la prueba, podemos configurar la aplicación para usar la propiedad:
@SpringBootApplication public class SpringBootApp extends WebMvcConfigurerAdapter { @Value("${springBootApp.workOffline:false}") private boolean workOffline = false; @Value("${springBootApp.setupSchema:false}") private boolean setupSchema = false; @PostConstruct public void initializeDB() { if (workOffline) { // ... } else { // ... } if (setupSchema) { // ... } } }Mientras escribía esta respuesta, noté un par de cosas:
workOffline para poder ejecutar pruebas, entonces probablemente solo desee mover las acciones de configuración de la base de datos fuera de la aplicación y en su lugar a la clase BaseTest .setupSchema@Sql y @SqlGroup : https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html# __sql¡De todos modos, buena suerte!