La différence entre @ContextConfiguration et @SpringApplicationConfiguration dans les tests d'intégration Spring Boot

Difference Between Contextconfiguration



Même s'il est utilisé en même temps @ContextConfiguration avec @SpringApplicationConfiguration Commentaires et SpringJUnit4ClassRunner Pour spécifier comment charger le contexte d'application Spring, il existe également des différences subtiles entre eux. malgré @ContextConfiguration Excellent pour charger le contexte d'application, mais sous-utilisé Caractéristiques de Spring Boot L'application Spring Boot se compose finalement de SpringApplication (pour JAR) ou de SpringBootServletInitializer load. Cette classe charge non seulement le contexte de l'application, mais permet également l'enregistrement et le chargement des propriétés externes spécifiées dans le fichier application.properties ou application.yml et d'autres fonctions qui ne sont pas chargées ou activées par le framework Spring Boot.
@ContextConfiguration annotation.
En bref, il est préférable d'utiliser @SpringApplicatoinConfiguration Comment au lieu de @ContextConfiguration Pour écrire des tests d'intégration pour les applications Spring Boot, y compris des tests pour les pages Web ou les applications frontales.

Maintenant tu sais que tu écris Test de démarrage à ressort Heure @ContextConfiguration avec @SpringApplicationConfiguration La différence essentielle entre les annotations, laissez-nous comprendre plus en détail quelques exemples de code.



Depuis l'introduction de Spring 2.5 SpringJUnit4ClassRunner Étant donné que Spring Framework a fourni un excellent support pour l'écriture de tests d'intégration, il en va de même pour les tests à l'aide des applications Spring Boot. Lors des tests d'intégration, vous devez également charger des beans et les connecter avec des dépendances.



Bien sûr, vous pouvez le faire manuellement, mais il est préférable de laisser Spring le gérer pour vous, ce qui est mieux. Il fournit également des fonctions prêtes à l'emploi telles que l'analyse des composants, l'assemblage automatique, la gestion des transactions de relevés, la sécurité et la mise en cache, qui sont très pratiques pour les tests dans un environnement de production plus proche.



Exemple Spring root @ xxxxx

Il s'agit d'un simple test d'intégration Spring, qui contient SpringJUnit4ClassRunner avec @ContextConfiguration Annotation, il est utilisé pour charger le contexte de l'application Annotations de base de Spring Boot une:

@RunWith (SpringJUnit4ClassRunner. class ) @ContextConfiguration (classes=BookConfiguration. class ) public class BookServiceTest { @Autowired private BookService bookService @Test public void testBookService() { Book aBook = bookService.findByTitle( 'Spring Boot in Action' ) assertEquals( 'Craig Walls' , aBook.getAuthor()) assertEquals( 40 , aBook.getPrice()) } }

Comme vous pouvez le voir, la classe BookServiceTest utilise @RunWith Annotation JUnit Annotez avec l'annotation @ContextConfiguration.

@RunWith Des annotations sont nécessaires pour activer les tests d'intégration Spring, c'est ce que nous SpringJUnit4ClassRunnner transférer SpringJUnit4ClassRunnner raison de classe, tandis que @ContextConfiguration L'annotation spécifie comment charger le contexte de l'application.



Dans cet exemple, chargera BookConfiguration Le contexte d'application Spring défini dans la classe.

SpringJUnit4ClassRunner Est une classe puissante, elle peut non seulement charger le contexte de l'application, mais aussi assembler automatiquement le bean dans le test.

Par exemple, dans cette classe de test, nous avons besoin d'un BookService pour tester sa méthode findByTitle(), et le bean est fait de SpringJUnit4ClassRunner La classe est automatiquement injectée, il suffit donc d'écrire du code
méthode testBookService ().

image

Revenons maintenant à @ContextConfiguration Même si cela aide à charger le contexte de l'application, il N'activera pas la journalisation ou Depuis application.properties Charger d'autres attributs Par exemple, la propriété server.port est une application nécessaire pour modifier le port du serveur tomcat intégré pendant le démarrage de Spring.

Pour résoudre ce problème, vous pouvez utiliser @SpringApplicaitonCongifguation Annotation à la place @ContextConfiguration ,Comme suit:

@RunWith (SpringJUnit4ClassRunner. class ) @SpringApplicaitonCongifguation (classes=BookConfiguration. class ) public class BookServiceTest { @Autowired private BookService bookService @Test public void testBookService() { Book aBook = bookService.findByTitle( 'Cloud Native Java' ) assertEquals( 'Josh Long' , aBook.getAuthor()) assertEquals( 40 , aBook.getPrice()) } }

Ce comportement est le même que dans l'exemple précédent, mais @SpringApplicationConfiguration Il activera également la journalisation Spring Boot et chargera d'autres propriétés définies dans le fichier application.properties ou application.yml.

C'est Spring Boot @ContextConfiguration with @SpringApplicationConfiguration La différence entre les commentaires Même avec SpringJUnit4ClassRunner Utilisé ensemble et aide à charger le contexte de l'application, les versions ultérieures sont toujours utiles car elles permettent également la journalisation et d'autres fonctionnalités de Spring Boot.

Il est préférable d'utiliser lors de l'écriture de tests d'intégration pour les applications Spring Boot @SpringApplicationConfiguration Rendre le test aussi proche que possible de l'environnement de production.

Merci d'avoir lu cet article jusqu'à présent. Si vous m'aimez @SpringApplicationConfiguration avec @ContextConfiguration Veuillez partager l'explication du commentaire avec vos amis et collègues. Si vous avez des questions ou des commentaires, veuillez laisser un message.

Traduit de: https://www.javacodegeeks.com/2019/02/difference-spring-boot-integration-test.html