Para ilustrar el problema, tengo dos clases @SpringBootTest separadas, cada una de las cuales tiene una clase estática interna @TestConfiguration, las cuales crean el mismo bean.
Cuando ejecuto TestB, veo que el bean "stringBeans" de TestA se está creando y utilizando y viceversa. ¿Por qué es esto? Quiero poder crear diferentes pruebas que definan el mismo bean pero con ese bean configurado de manera diferente. ¿Cómo puedo conseguir esto?
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = "spring.main.allow-bean-definition-overriding=true") public class TestA { @TestConfiguration static class TestConfig { @Bean @Primary public String stringBeans() { System.out.println("Creating string bean from Test A"); return "Test A"; } } @Test public void testA() { System.out.println("Running Test A"); } }Al ejecutar la prueba anterior, veo el siguiente resultado:
Creando string bean a partir de la Prueba B
Ejecución de la prueba A
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = "spring.main.allow-bean-definition-overriding=true") public class TestB { @Autowired String stringBeans; @TestConfiguration static class TestConfig { @Bean @Primary public String stringBeans() { System.out.println("Creating string bean from Test B"); return "Test B"; } } @Test public void testB() { System.out.println("Running Test B"); assertThat(stringBeans).isEqualTo("Test B"); } }Al ejecutar la prueba anterior, la aserción falla y veo el siguiente resultado:
Creando string bean a partir de la Prueba A
Ejecución de la prueba B
Intenté crear clases separadas anotadas con @TestConfiguration y usar @Import para incluirlas en cada prueba respectiva, pero eso no resuelve este problema de manera consistente.
Estaba probando una Spring Cloud Function y resultó que tenía un análisis de componentes definido en application.yml en la carpeta test/resources que estaba causando que se evaluaran ambas clases @TestConfiguration internas. Por lo tanto, debe tener mucho cuidado con la configuración de su prueba; de lo contrario, puede ocurrir un comportamiento extraño que puede ser difícil de rastrear.
En este ejemplo, tenía todas mis clases definidas en com.example.demo y application.yml de la siguiente manera
spring: cloud: function: scan: packages: com.example.demoLas pruebas se ejecutan como se esperaba después de eliminar este análisis innecesario.