2016-08-19 6 views
12

Podczas mojej wiosennej sesji startowej chcę zastąpić jedną z moich klas @Configuration konfiguracją testową (w szczególności moją klasą @EnableAuthorizationServer@Configuration) we wszystkich moich testach.Zastępowanie pojedynczej klasy @Configuration przy każdym rozruchu wiosennym @Test

Dotychczas po przegląd spring boot testing features i spring integration testing features nie proste rozwiązanie utwardzonych:

  • @TestConfiguration: to rozszerzenia, nie nadrzędnych;
  • @ContextConfiguration(classes=…​) i @SpringApplicationConfiguration(classes =…​) pozwala mi zastąpić całą konfigurację, a nie tylko jedną klasę;
  • Wewnętrzna klasa @Configuration wewnątrz @Test sugeruje zastąpić domyślną konfigurację, ale nie podano przykładu;

Wszelkie sugestie?

Odpowiedz

15

Test Wewnętrzna konfiguracja

Przykład wewnętrznej @Configuration dla badania:

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

    @Configuration 
    static class ContextConfiguration { 
     @Bean 
     @Primary //may omit this if this is the only SomeBean defined/visible 
     public SomeBean someBean() { 
      return new SomeBean(); 
     } 
    } 

    @Autowired 
    private SomeBean someBean; 

    @Test 
    public void testMethod() { 
     // test 
    } 
} 

poziomie klasy adnotacje @RunWith(SpringRunner.class) i @SpringBootTest są Spring Boot 1.4+, ale przykład wewnętrzny @ Konfiguracja jest ważna nawet w starszych wersjach z użyciem @RunWith(SpringJUnit4ClassRunner.class) i @SpringApplicationConfiguration lub @ContextConfiguration.

@Primary

@Primary adnotacja w sprawie definicji ziarna jest zapewnienie, że ten będzie miał pierwszeństwo, jeśli więcej niż jeden znajdują.

wielokrotnego użytku konfiguracja testu

Jeśli chcesz ponownie użyć konfiguracji testowej dla wielu testów, można zdefiniować autonomiczną klasę konfiguracji ze sprężyną Profil @Profile("test"). Następnie poproś swoją klasę testów, aby aktywowała profil pod numerem @ActiveProfiles("test"). Zobacz pełny kod:

@RunWith(SpringRunner.class) 
@SpringBootTests 
@ActiveProfiles("test") 
public class SomeTest { 

    @Autowired 
    private SomeBean someBean; 

    @Test 
    public void testMethod() { 
     // test 
    } 
} 

@Configuration 
@Profile("test") 
public class TestConfiguration { 
    @Bean 
    @Primary //may omit this if this is the only SomeBean defined/visible 
    public SomeBean someBean() { 
     return new SomeBean(); 
    } 
} 
+2

Dzięki. Zauważyłem, że mogę także przesłonić klasę we wszystkich testach, porzucając nadpisującą klasę '@ EnableAuthorizationServer'' Configuration w' src/test/java'. Reguły wiosennego startu :-) – NotGaeL

+0

Jako sidenote, jeśli potrzebujesz tylko zmienić jedną wartość na konkretnej '@ Configuration', zamiast przesłonić to wszystko możesz włączyć specjalny profil startowy wiosennego (np. O nazwie' test') dla twoich testów za pomocą adnotacji '@ActiveProfiles ({" test ", ...})' na twoich testowych klasach. Następnie proste 'if (Arrays.asList (environment.getActiveProfiles()). Zawiera (" test "))' na twoim '@ Konfiguracja' zrobi. – NotGaeL

+1

Twoje rozwiązanie nie powiedzie się, jeśli jedna z pozostałych fasoli używa wewnętrznie, jest wstrzykiwana przez klasę SomeBean. Aby to zadziałało wystarczy dodać klasę ContextConfiguration na liście klas używanych przez adnotację SpringBootTest. To znaczy: @SpringBootTest (classes = {Application.class, SomeTest.ContextConfiguration.class}) –

3

Należy użyć spring boot profiles:

  1. Opisywanie konfigurację testową z @Profile("test").
  2. Opisz swoją konfigurację produkcyjną, podając @Profile("production").
  3. Ustaw profil produkcyjny w swoim pliku właściwości: spring.profiles.active=production.
  4. Ustaw profil testowy w swojej klasie testowej na @Profile("test").

Tak więc, gdy aplikacja się uruchomi, użyje klasy "produkcja", a gdy gwiazdy testowe użyje klasy "test".

Jeśli używasz klasy wewnętrznej/zagnieżdżonej @Configuration, zostanie ona użyta zamiast podstawowej konfiguracji aplikacji.

Powiązane problemy