[JAVA] Problemumgehung für Command Line Runner zur Arbeit mit JUnit in Spring Boot

Hintergrund und Probleme

Verwenden Sie im Spring Boot den Befehlszeilen-Runner Sie können Anwendungen entwickeln, die über die Befehlszeile ausgeführt werden.

Aber in einer Anwendung, die CommandLineRunner verwendet Wenn Sie einen Test in JUnit ausführen, wird nicht nur der Testcode, sondern auch die Verarbeitung von CommandLineRunner selbst ausgeführt.

Ich fühlte mich ein bisschen verrückt, also wollte ich es irgendwie vermeiden.

Ausführungsumgebung

Ausführungscode und Test und Ausgabe

Ausführungscode

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!!";
  }
}

Testcode

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());
	}
}

Das Ergebnis der Ausführung von JUnit ist wie folgt.

Ausführungsergebnis


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

Kürzung

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

Wenn JUnit ausgeführt wird, wird es von CommandLineRunner ausgegeben

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

Wird ausgegeben. Ich möchte, dass nur der Testcode funktioniert, aber auch CommandLineRunner wurde ausgeführt.

Problemumgehung

Ich möchte CommandLineRunner nicht ausführen, wenn ich JUnit ausführe, daher werde ich nach einer Möglichkeit suchen, dies zu tun. Versuchen Sie es unter Bezugnahme auf das Folgende. https://stackoverflow.com/questions/29344313/prevent-application-commandlinerunner-classes-from-executing-during-junit-test

Verwenden Sie Profilanmerkungen

Diese Methode entfällt, da der Stapelüberlauf und Qiita leicht verständliche Artikel enthalten. https://qiita.com/ftsan/items/80b00f8fb8129ecbdf97

Ich frage mich jedoch, ob es eine andere Methode gibt Ich habe versucht herauszufinden, ob es einen anderen Weg gibt, den Testcode zu reparieren.

Verwenden Sie Anmerkungen zur Kontextkonfiguration

Im Testcode SampleOutputTest.java Kommentieren Sie "SpringBootTest" `ContextConfiguration(classes = SampleApplication.class, initializers = ConfigFileApplicationContextInitializer.class) Ändern Sie zu "Anmerkung".

SampleOutputTest.java


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

Wenn Sie den Test jetzt ausführen, können Sie ihn testen, ohne CommandLineRunner auszuführen. Der Teil classes = SampleApplication.class gibt die Klasse an, in der sich die Hauptmethode befindet.

Ausführungsergebnis


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

Unten weggelassen

Jetzt können Sie testen, ohne CommandLineRunner auszuführen, indem Sie nur den Testcode ändern. Bedeutet dies, dass "SpringBootTest" verschiedene Einstellungen lädt, "ContextConfiguration" jedoch nicht alle Einstellungen lädt?

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html Wenn Sie dieses Dokument sorgfältig gelesen haben, finden Sie es unter 43.4 Test Utilities. Es wurde geschrieben, dass Sie dies verwenden sollten, wenn Sie nicht alle Funktionen von SpringBootTest verwenden müssen.


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

Recommended Posts

Problemumgehung für Command Line Runner zur Arbeit mit JUnit in Spring Boot
Einstellungen für die Verbindung zu MySQL mit Spring Boot + Spring JDBC
Ausführen der Erstverarbeitung mit Spring Boot Command Line Runner
[Java] LINE-Integration mit Spring Boot
Spring.messages.fallback-to-system-locale: false ist erforderlich, um message.properties für die i18n-Unterstützung von Spring boot als Standard festzulegen
[Java] So testen Sie, ob es in JUnit null ist
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Verwendung des eingebauten h2db mit Federstiefel
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So führen Sie UT mit Excel als Testdaten mit Spring Boot + JUnit5 + DBUnit durch
[Java] Hallo Welt mit Java 14 x Spring Boot 2.3 x JUnit 5 ~
So binden Sie mit einer Eigenschaftendatei in Spring Boot
Versuchen Sie, die Migration mit Spring Boot Flyway zu automatisieren
[Java] Artikel zum Hinzufügen einer Validierung mit Spring Boot 2.3.1.
Ich wollte Spring Boot in einem Multiprojekt gradle
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Nehmen Sie das externe Glas mit Spring boot2 + Maven3 in das Paket auf
So stellen Sie Spring Boot Dependency Injection (DI) ein
So schreiben Sie einen Komponententest für Spring Boot 2
Ordnen Sie DTO automatisch Entitäten mit der Spring Boot-API zu
[JUnit 5-kompatibel] Schreiben Sie einen Test mit JUnit 5 mit Spring Boot 2.2, 2.3
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
SSO mit GitHub OAuth in der Spring Boot 1.5.x-Umgebung
[JUnit 5] Schreiben Sie einen Validierungstest mit Spring Boot! [Parametrisierungstest]
Verwendung von CommandLineRunner im Spring Batch von Spring Boot
Bis Sie mit der Entwicklung mit Spring Boot in Eclipse 1 beginnen
Führen Sie swagger-ui in die in Spring Boot implementierte REST-API ein
Booten nach Umgebung mit Spring Boot of Maven
Bis Sie mit der Entwicklung mit Spring Boot in Eclipse 2 beginnen
Versuch, SSR Vue.js mit Spring Boot und GraalJS zu verwenden
Ich habe jetzt einen Test mit Spring Boot + JUnit 5 geschrieben
Erstellen einer Datenbankumgebung mit Docker in Spring Boot (IntellJ)
Versuchen Sie, mit Keycloak mit Spring Security SAML (Spring 5) zu arbeiten.
Mit Spring Boot herunterladen
Verwendung derselben Mapper-Klasse in mehreren Datenquellen mit Spring Boot + MyBatis
Ich möchte die maximale Dateigröße für das Hochladen von Dateien für jede URL in Spring Boot steuern
Lassen Sie uns herausfinden, wie Sie mit Request Body mit der REST-API von Spring Boot empfangen können
Erforderliche Schritte zum Ausgeben von asynchronen Spring Boot-Ereignissen
Geben Sie das integrierte Tomcat-Zugriffsprotokoll mit Spring Boot an die Standardausgabe aus
So ändern Sie den Einstellungswert von application.properties beim Booten im Frühjahrsstart
Schneiden Sie SQL in die Eigenschaftendatei mit jdbcTemplate von Spring Boot aus
Bis INSERT und SELECT für Postgres mit Spring Boot und Thymianblatt
Aufrufen und Verwenden der API in Java (Spring Boot)
Stellen Sie mit spring boot + spring jpa eine Verbindung zur Datenbank her und führen Sie die CRUD-Operation durch
Fluss bis zur Ausgabe von Tabellendaten, die mit Spring Boot angezeigt werden sollen
Verwenden Sie thymeleaf3 mit parent, ohne Spring-Boot-Starter-Parent in Spring Boot anzugeben
Ich habe versucht, mit Swagger mit Spring Boot zu beginnen
Verwenden Sie Spring Test + Mockito + JUnit 4 für Spring Boot + Spring Retry Unit Test
Verwenden Sie im Spring Boot @ControllerAdvice, @ExceptionHandler, HandlerExceptionResolver, um Ausnahmen abzufangen
So steuern Sie Transaktionen in Spring Boot ohne Verwendung von @Transactional
[Java] Beispielprojekt zum Entwickeln von Webanwendungen mit Spring Boot
Legen Sie den Kontextparameter in Spring Boot fest
Versuchen Sie Spring Boot von 0 bis 100.
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Implementieren Sie GraphQL mit Spring Boot
Beginnen Sie mit Spring Boot
Hallo Welt mit Spring Boot!
Spring Boot 2 Multiprojekt mit Gradle