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.
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é.
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
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.
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