[JAVA] Solution de contournement pour que Command Line Runner fonctionne avec JUnit dans Spring Boot

Contexte et problèmes

Dans Spring Boot, utilisez Command Line Runner Vous pouvez développer des applications qui s'exécutent à partir de la ligne de commande.

Mais dans une application qui utilise CommandLineRunner Lorsque vous exécutez un test dans JUnit, non seulement le code de test, mais également le traitement de CommandLineRunner lui-même est exécuté.

Je me sentais un peu folle, alors je voulais l'éviter d'une manière ou d'une autre.

Environnement d'exécution

Code d'exécution et test et sortie

Code d'exécution

SampleApplication.java


package com.example.demo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SampleApplication implements CommandLineRunner {

  public static void main(String[] args) {
    SpringApplication.run(SampleApplication.class, args);
  }

  @Override
  public void run(String... arg) {
    SampleOutput sample = new SampleOutput();
    System.out.println(sample.sayTest());
    System.out.println("!!!Sample CommandLineRunner Start!!!");
  }
}

SampleOutput.java


package com.example.demo;

public class SampleOutput {

  public String sayTest() {
    return "test!!";
  }
}

Code de test

SampleOutputTest


package com.example.demo;

import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleOutputTest {

	@Test
	public void testTest() {
	  SampleOutput sample = new SampleOutput();
	  assertEquals("test!!", sample.sayTest());
	}
}

Le résultat de l'exécution de JUnit est le suivant.

Résultat d'exécution


07:42:33.780 [main] DEBUG org.springframework.test.context.junit4.SpringJUnit4ClassRunner - SpringJUnit4ClassRunner constructor called with [class com.example.demo.SampleOutputTest]

réduction

2018-06-13 07:42:34.458  INFO 6564 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2df9b86: startup date [Wed Jun 13 07:42:34 JST 2018]; root of context hierarchy
2018-06-13 07:42:35.128  INFO 6564 --- [           main] com.example.demo.SampleOutputTest        : Started SampleOutputTest in 0.972 seconds (JVM running for 1.867)
test!!
!!!Sample CommandLineRunner Start!!!
2018-06-13 07:42:35.190  INFO 6564 --- [       Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@2df9b86: startup date [Wed Jun 13 07:42:34 JST 2018]; root of context hierarchy

Lorsque JUnit est exécuté, il est généré par CommandLineRunner

test!!
!!!Sample CommandLineRunner Start!!!

Est sortie. Je veux que seul le code de test fonctionne, mais même CommandLineRunner a été exécuté.

solution de contournement

Je ne veux pas exécuter CommandLineRunner lors de l'exécution de JUnit, je vais donc chercher un moyen de le faire. Essayez-le en vous référant à ce qui suit. https://stackoverflow.com/questions/29344313/prevent-application-commandlinerunner-classes-from-executing-during-junit-test

Utiliser les annotations de profil

Cette méthode est omise car il existe des articles faciles à comprendre dans le débordement de pile et Qiita. https://qiita.com/ftsan/items/80b00f8fb8129ecbdf97

Cependant, je me demande s'il existe une méthode différente J'ai essayé de voir s'il y avait un autre moyen de corriger le code de test.

Utiliser les annotations de configuration de contexte

Dans le code de test SampleOutputTest.java Annoter SpringBootTest `ContextConfiguration(classes = SampleApplication.class, initializers = ConfigFileApplicationContextInitializer.class) Modifiez-le en ʻannotation.

SampleOutputTest.java


@RunWith(SpringRunner.class)
@ContextConfiguration(classes = SampleApplication.class, 
initializers = ConfigFileApplicationContextInitializer.class)
public class SampleOutputTest {

Désormais, lorsque vous exécutez le test, vous pouvez le tester sans exécuter CommandLineRunner. La partie classes = SampleApplication.class spécifie la classe où se trouve la méthode principale.

Résultat d'exécution


07:44:49.301 [main] DEBUG org.springframework.test.context.junit4.SpringJUnit4ClassRunner - SpringJUnit4ClassRunner constructor called with [class com.example.demo.SampleOutputTest]

Omis ci-dessous

Vous pouvez maintenant tester sans exécuter CommandLineRunner avec juste la modification du code de test. Cela signifie-t-il que SpringBootTest charge divers paramètres, mais que ContextConfiguration ne charge pas tous les paramètres?

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html Si vous lisez attentivement ce document, vous pouvez le trouver sous 43.4 Utilitaires de test. Il a été écrit que vous devriez l'utiliser si vous n'avez pas besoin d'utiliser toutes les fonctions de SpringBootTest.


@ContextConfiguration(classes = Config.class,
	initializers = ConfigFileApplicationContextInitializer.class)

Recommended Posts

Solution de contournement pour que Command Line Runner fonctionne avec JUnit dans Spring Boot
Paramètres de connexion à MySQL avec Spring Boot + Spring JDBC
Exécution du traitement initial à l'aide de Spring Boot Command Line Runner
[Java] Intégration LINE avec Spring Boot
Spring.messages.fallback-to-system-locale: false est requis pour le message par défaut.properties pour la prise en charge i18n de Spring Boot
[Java] Comment tester s'il est nul dans JUnit
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment utiliser h2db intégré avec Spring Boot
Essayez d'implémenter la fonction de connexion avec Spring Boot
Comment ajouter un chemin de classe dans Spring Boot
Comment effectuer UT avec Excel en tant que données de test avec Spring Boot + JUnit5 + DBUnit
[Java] Hello World avec Java 14 x Spring Boot 2.3 x JUnit 5 ~
Comment se lier avec un fichier de propriétés dans Spring Boot
Essayez d'automatiser la migration avec Spring Boot Flyway
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Je voulais classer la botte à ressort dans un multi-projet
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Inclure le pot externe dans le package avec Spring boot2 + Maven3
Comment définir l'injection de dépendance Spring Boot (DI)
Comment écrire un test unitaire pour Spring Boot 2
Mappez automatiquement DTO aux entités avec l'API Spring Boot
[Compatible JUnit 5] Ecrire un test en utilisant JUnit 5 avec Spring boot 2.2, 2.3
Comment créer un projet Spring Boot dans IntelliJ
[Spring Boot] Comment créer un projet (pour les débutants)
SSO avec GitHub OAuth dans l'environnement Spring Boot 1.5.x
[JUnit 5] Ecrivez un test de validation avec Spring Boot! [Test de paramétrage]
Comment utiliser CommandLineRunner dans Spring Batch of Spring Boot
Jusqu'à ce que vous commenciez à développer avec Spring Boot dans eclipse 1
Présentez swagger-ui à l'API REST implémentée dans Spring Boot
Comment démarrer par environnement avec Spring Boot de Maven
Jusqu'à ce que vous commenciez à développer avec Spring Boot dans eclipse 2
Tentative de SSR Vue.js avec Spring Boot et GraalJS
J'ai écrit un test avec Spring Boot + JUnit 5 maintenant
Création d'un environnement de base de données avec Docker dans Spring Boot (IntellJ)
Essayez de travailler avec Keycloak en utilisant Spring Security SAML (Spring 5)
Télécharger avec Spring Boot
Comment utiliser la même classe Mapper dans plusieurs sources de données avec Spring Boot + MyBatis
Je souhaite contrôler la taille de fichier maximale pour le téléchargement de fichiers pour chaque URL dans Spring Boot
Découvrons comment recevoir avec Request Body avec l'API REST de Spring Boot
Étapes requises pour émettre des événements asynchrones Spring Boot
Sortez le journal d'accès Tomcat intégré à la sortie standard avec Spring Boot
Comment modifier la valeur de paramètre de application.properties au moment du démarrage dans Spring Boot
Découpez SQL en fichier de propriété avec jdbcTemplate of spring boot
Jusqu'à INSERT et SELECT sur Postgres avec botte de printemps et feuille de thym
Comment appeler et utiliser l'API en Java (Spring Boot)
Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
Flux jusqu'à la sortie des données de la table à afficher avec Spring Boot
Utilisez thymeleaf3 avec le parent sans spécifier spring-boot-starter-parent dans Spring Boot
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
Utilisez Spring Test + Mockito + JUnit 4 pour le test unitaire Spring Boot + Spring Retry
Utilisez @ControllerAdvice, @ExceptionHandler, HandlerExceptionResolver dans Spring Boot pour intercepter les exceptions
Comment contrôler les transactions dans Spring Boot sans utiliser @Transactional
[Java] Exemple de projet de développement d'applications Web avec Spring Boot
Définir le paramètre contextuel dans Spring Boot
Essayez Spring Boot de 0 à 100.
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Multi-projets Spring Boot 2 avec Gradle