Verhindern, dass Application / CommandLineRunner Klassen während der Ausführung von JUnit-Tests
Wenn du in deinem TestCase-Klasse gibt es diese Anmerkungen:
@SpringApplicationConfiguration(classes = {Application.class})
dadurch wird die Application.class
Umsetzung der CommandLineRunner
- Schnittstelle, führen Sie die erforderliche Methode
public void run(String... args) throws Exception
Ich denke immer noch das ist, meistens, ein nicht erwünschtes Verhalten, da in der Testumgebung können Sie nicht wollen, um die gesamte Anwendung.
Habe ich im Hinterkopf, zwei Lösungen dieses problem zu umgehen:
- zu entfernen, die
CommandLineRunner
Schnittstelle von meinemApplication
Klasse - einen anderen Kontext für die Prüfung
Beide diese Lösung erfordert eine Menge coding.
Haben Sie eine bequeme Lösung?
- Können Sie ein Beispiel geben, was Sie testen wollen? Wenn Sie wollen, etwas zu testen, ohne die ganze Anwendung, als Sie müssten sich dann nicht die annotation.
- Ich möchte zum testen der ganzen Anwendung (sagen wir mal mit alle registrierten beans). Was ich nicht mag ist, dass die gesamte Anwendung gestartet wird, aufgrund der
CommandLineRunner
interface-Implementierung. Es sollte eine Möglichkeit zum laden einer Anwendung Klasse, ohne dasrun
Methode. - Das ist genau meine Meinung, es ist eine unerwünschte Nebenwirkung oder zumindest SpringRunner sollte Ihnen die Möglichkeit geben, es zu verhindern. und starten Sie den Kontext, wenn alles in test-setup.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jan ' s Lösung erreicht werden kann, zu erleichtern.
In der test-Klasse, aktivieren Sie die "test" - Profil:
In Ihrem CommandLineRunner das Profil NICHT testen:
Dann müssen Sie nicht haben, um manuell festzulegen, dass das Profil in der Anwendung.
Als im Frühjahr erwähnten Dokumentation http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html können Sie @ContextConfiguration mit einer speziellen Initialisierung:
In diesem Beispiel anyComponent initialisiert und Eigenschaften injiziert werden, aber run(args) Methoden nicht ausgeführt werden. (Application.class ist mein main spring entry point)
Definieren Sie eine test-Konfiguration in der gleichen Verpackung wie Ihre Anwendung, die sieht genau das gleiche, außer, dass es ausschließt, Bohnen Umsetzung CommandLineRunner. Der Schlüssel hier ist, @ComponentScan.excludeFilters:
Dann ersetzen Sie einfach die Konfiguration auf Ihrem test:
Kein CommandLineRunner ausgeführt werden, jetzt, da Sie nicht Teil der Konfiguration.
Application.class
imexcludeFilters
Attribut, oder es scannt die Bohnen, die Sie versucht auszuschließen.SpringApplicationConfiguration
@deprecated (veraltet 1.4 zu Gunsten vonSpringBootTest
. Kann ersetzt werden durch@SprinBootTest(classes = TestApplicationConfiguration.class)
Ich bin ein bisschen spät zur party, aber ein vernünftiger Ansatz, ist markieren Sie die Bohne mit
@ConditionalOnProperty
z.B.Folgende Anmerkung wird, dann deaktivieren Sie es in tests:
Wenn Sie ein mocking framework installiert ist (z.B. MockMVC) können Sie eine mock-Instanz der CommandLineRunner Umsetzung, mehr oder weniger zu deaktivieren:
@MockBean
private TextProcessor myProcessor;
@EventListener(ApplicationReadyEvent.class)
AnsatzVorherigen Antworten hat nicht funktioniert wor mir. Ich landete mit unterschiedlichen Profilen - Beispiel für die init-Methode in den Frühling Starten:
Diese wird nicht ausgeführt, während die tests so sind wir sicher hier.
Alle tests haben ein eigenes Profil "test" (was nützlich ist, in vielen anderen Möglichkeiten auch):
Den command-line-Läufer versehen mit der "Produktion" Profil, damit die tests ignorieren:
Ich dies lösen, indem Sie nicht an der Umsetzung CommandLineRunner. Einfach ein bean aus dem context, und rufen Sie eine Methode auf, übergeben argv. Auf diese Weise erhalten Sie das gleiche Ergebnis, und die Anwendung nicht automatisch gestartet, wenn mit der Ausführung der tests.