Sur mon application de démarrage printanière, je souhaite remplacer une seule de mes classes @Configuration
Par une configuration de test (en particulier ma classe @EnableAuthorizationServer
@Configuration
), Dans tous mes tests.
Jusqu'à présent, après un aperçu de fonctionnalités de test de démarrage du ressort et fonctionnalités de test d'intégration du ressort , aucune solution simple n'a fait surface:
@TestConfiguration
: C'est pour étendre, pas écraser;@ContextConfiguration(classes=…)
et @SpringApplicationConfiguration(classes =…)
me permettent de remplacer la configuration entière, pas seulement la classe;@Configuration
À l'intérieur d'un @Test
Est suggérée pour remplacer la configuration par défaut, mais aucun exemple n'est fourni;Aucune suggestion?
configuration de test interne
Exemple de @Configuration interne pour votre test:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeTest {
@Configuration
static class ContextConfiguration {
@Bean
@Primary //may omit this if this is the only SomeBean defined/visible
public SomeBean someBean () {
return new SomeBean();
}
}
@Autowired
private SomeBean someBean;
@Test
public void testMethod() {
// test
}
}
configuration de test réutilisable
Si vous souhaitez réutiliser la configuration de test pour plusieurs tests, vous pouvez définir une classe de configuration autonome avec un profil de ressort @Profile("test")
. Ensuite, demandez à votre classe de test d’activer le profil avec @ActiveProfiles("test")
. Voir le code complet:
@RunWith(SpringRunner.class)
@SpringBootTests
@ActiveProfiles("test")
public class SomeTest {
@Autowired
private SomeBean someBean;
@Test
public void testMethod() {
// test
}
}
@Configuration
@Profile("test")
public class TestConfiguration {
@Bean
@Primary //may omit this if this is the only SomeBean defined/visible
public SomeBean someBean() {
return new SomeBean();
}
}
@ Primaire
L'annotation @Primary
Sur la définition du bean est destinée à garantir que celle-ci sera prioritaire si plusieurs sont trouvées.
Vous devriez utiliser profils de démarrage à ressort :
@Profile("test")
.@Profile("production")
.spring.profiles.active=production
.@Profile("test")
.Ainsi, lorsque votre application démarrera, elle utilisera la classe "production" et, lorsque les étoiles de test, elle utilisera la classe "test".
Si vous utilisez la classe inner/nested @Configuration
, Elle sera utilisée à la place de la configuration principale de votre application.
J'ai récemment dû créer une version de développement de notre application, qui devrait fonctionner avec le profil actif dev
prêt à l'emploi, sans aucun argument de ligne de commande. Je l'ai résolu en ajoutant cette classe en tant que nouvelle entrée, qui définit le profil actif par programme:
package ...;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.StandardEnvironment;
@Import(OriginalApplication.class)
public class DevelopmentApplication {
public static void main(String[] args) {
SpringApplication application =
new SpringApplication(DevelopmentApplication.class);
ConfigurableEnvironment environment = new StandardEnvironment();
environment.setActiveProfiles("dev");
application.setEnvironment(environment);
application.run(args);
}
}
Voir Exemple de profils d'amorçage de printemps par Arvind Rai pour plus de détails.