2016-09-25 11 views
22

Spring-boot używa profili Spring (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html), które pozwalają na przykład na osobną konfigurację dla różnych środowisk. Jednym ze sposobów użycia tej funkcji jest skonfigurowanie testowej bazy danych do użycia w testach integracyjnych. Zastanawiam się jednak, czy konieczne jest utworzenie mojego własnego profilu "test" i jawnie aktywować ten profil w każdym pliku testowym? Teraz mogę to zrobić w następujący sposób:Domyślny profil rozruchowy wiosennego rozruchu dla testów integracyjnych

  1. Tworzenie application-test.properties wewnątrz src/main/zasobów
  2. specyficzny config tam
  3. Zapis testowy (tylko nazwa bazy danych na razie)
  4. W każdy plik testy obejmują:

    @ActiveProfiles("test") 
    

Czy jest mądrzejszy/bardziej zwięzły sposób? Na przykład domyślny profil testowy?

Edit 1: To pytanie dotyczy Wiosna-Boot 1.4.1

Odpowiedz

33

O ile wiem, nie ma niczego bezpośrednio adresowania prośbę - ale mogę zaproponować propozycji, które mogłyby pomóc.

Można użyć własnej adnotacji testowej, która jest meta annotation zawierająca @SpringBootTest i @ActiveProfiles("test"). Nadal potrzebujesz dedykowanego profilu, ale unikaj rozpraszania definicji profilu we wszystkich testach.

Ta adnotacja będzie domyślnie testowana na profilu i możesz zastąpić profil za pomocą adnotacji meta.

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@SpringBootTest 
@ActiveProfiles 
public @interface MyApplicationTest { 
    @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"}; 
} 
6

Można umieścić plik application.properties w folderze test/resources. W tym miejscu ustawiasz domyślny profil testowy podczas uruchamiania testów.

+0

używam ten wpis w moich testach, jeśli chcę uniknąć ustawiania @ActiveProfiles ("test"). Czy to nie działa? – Compito

+9

Jeśli utworzę plik 'src/test/resources/application.properties', zawartość' src/main/resources/application.properties' zostanie zignorowana podczas uruchamiania testów. – ciastek

19

Innym sposobem, aby to zrobić jest określenie podstawy (streszczenie) class Test że rzeczywiste klasy badań rozszerzy:

@RunWith(SpringRunner.class) 
@SpringBootTest() 
@ActiveProfiles("staging") 
public abstract class BaseIntegrationTest { 
} 

Concrete Test:

public class SampleSearchServiceTest extends BaseIntegrationTest{ 

    @Inject 
    private SampleSearchService service; 

    @Test 
    public void shouldInjectService(){ 
     assertThat(this.service).isNotNull(); 
    } 
} 

To pozwala wyodrębnić więcej niż tylko adnotacja @ActiveProfiles. Można również wyobrazić sobie bardziej wyspecjalizowane klasy bazowe dla różnych rodzajów testów integracyjnych, np. warstwa dostępu do danych a warstwa usługowa lub dla funkcjonalnych specjalności (wspólne metody @Before lub @After).

-1

W moim przypadku mam różne application.properties w zależności od środowiska, coś jak:

application.properties (base file) 
application-dev.properties 
application-qa.properties 
application-prod.properties 

i application.properties zawiera spring.profiles.active właściwość, aby wybrać odpowiedni plik.

Dla moich testów integracyjnych, stworzyłem nową application-test.properties plik wewnątrz test/resources iz @TestPropertySource({ "/application-test.properties" }) adnotacji jest to plik, który jest odpowiedzialny za zbieranie application.properties chcę, w zależności od moich potrzeb dla tych testów