2016-12-06 3 views
1

Derzeit verwende ich @BootstrapWith Annotation in Verbindung mit benutzerdefinierten Klasse, die einfach einige im Test verwendete Systemeigenschaften setzt. Allerdings (soweit ich es verstehe) diese Eigenschaften festgelegt werden jedes Mal TestContextManager instanziiert Test und Testcontext mit ihm:Spring: @BootstrapWith für ApplicationContext

@BootstrapWith ist eine Klasse-Ebene Anmerkung, die verwendet wird zu konfigurieren, wie der Frühling Testcontext Framework

Bootstrap

spring.io

gibt es eine Möglichkeit Eigenschaften einmal einzustellen, bevor Application gestartet wird?

Edit:

ich nicht @RunWith(SpringJUnit4ClassRunner.class) aufgrund parametrisierte Tests verwenden, die @RunWith(Parameterized.class) erfordern. Ich benutze SpringClassRule und SpringMethodRule statt

Zusätzlich laufe ich nicht nur parametrisierte Tests, sondern auch normale Tests. So kann ich nicht einfach Parameterized Läufer

+0

meinst du ' System.getProperties() '? –

+0

@MaciejDobrowolski System.setProperty() bevor ApplicationContext gestartet wird – Anton

+0

Müssen Sie Eigenschaften global festlegen oder sollten sie für jede Testsuite unterschiedlich sein? –

Antwort

1

verlängern denke ich, dass die einfachste Art und Weise einige Eigenschaften der Einstellung vor ApplicationContext Sätze nach oben ist Brauch Läufer zu schreiben, wie folgt aus:

public class MyRunner extends SpringJUnit4ClassRunner { 

    public MyRunner(Class<?> clazz) throws InitializationError { 
     super(clazz); 
     System.setProperty("sample.property", "hello world!"); 
    } 

} 

Und dann können Sie es verwenden, anstatt Ihre aktueller Läufer.

@RunWith(MyRunner.class) 
@SpringBootTest 
//.... 

Wenn Ihr aktueller Läufer scheint endgültig zu erklären, können Sie möglicherweise Aggregation verwenden (aber ich habe nicht geprüft) anstelle von Vererbung.

Here Sie können ein Beispiel Gist finden, wo dieser Läufer verwendet wird und die Eigenschaft erfolgreich gelöst wird.

Update

Wenn Sie nicht wollen, benutzerdefinierte Runner verwenden (obwohl Sie für jeden Fall festigende Eigenschaften mehrere Läufer haben könnte - mit Parametern, ohne Parameter, und so weiter). Sie können @ClassRule verwenden, die auf statische Felder/Methoden arbeitet - im Beispiel unten einen Blick:

@ClassRule 
public static ExternalResource setProperties() { 
    return new ExternalResource() { 
     @Override 
     public Statement apply(Statement base, Description description) { 
      System.setProperty("sample.property", "hello world!"); 
      return super.apply(base, description); 
     } 
    }; 
} 

Diese statische Methode ist in der Testklasse platziert werden.

+0

Wahrscheinlich hätte ich es in Frage erwähnt: Ich kann @RunWith (SpringJUnit4ClassRunner.class) aufgrund parametrisierter Tests nicht verwenden, die @RunWIth (Parameterized.class) erfordern. Ich benutze stattdessen SpringClassRule und SpringMethodRule – Anton

+0

@Anton Warum nicht "parametrisierte" Läufer erweitern? –

+0

In diesem Fall kann ich keine Eigenschaften für normale, nicht parametrisierte Tests setzen – Anton

0

entdeckte ich, dass dies möglich ist, mit der Erweiterung AnnotationConfigContextLoader (oder jede andere ContextLoader) und übergeordnete prepareContext() Methode:

@Override 
protected void prepareContext(ConfigurableApplicationContext context, MergedContextConfiguration mergedConfig) { 
    // set properties here 
    super.prepareContext(context, mergedConfig); 
} 

als benutzerdefinierte loader in @ContextConfiguration Anmerkung auf Testinstanz angegeben werden sollte

Verwandte Themen