2012-06-12 12 views
16

Nasza aplikacja internetowa korzysta SystemPropertyPlaceholder załadować pliki własności w zależności od wartości nieruchomości systemowej (patrz poniżej)Set system własności do JUnit androidów (Eclipse), aby przetestować wiosna Web App

Domyślna konfiguracja dla uruchomiony lokalnie jest przechowywany w application.properties. Na serwerze produkcyjnym właśnie ustawiamy "env" na "production" przed wdrożeniem aplikacji i załaduje ona production.properties.

Teraz do testowania aplikacji należy użyć pliku test.properties.

Jeśli przeprowadzę wszystkie testy w naszej kompilacji Jenkins, dodanie -Denv=test będzie działać zgodnie z oczekiwaniami. Ale co, jeśli po prostu chcę uruchomić jeden test w Eclipse ze zintegrowanym biegaczem JUnit?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = WebContextLoader.class, locations = {"classpath:application-context.xml" }) 
public class SomeTest { 

Czy istnieje jakiś sposób, aby powiedzieć mój test należy ustawić właściwości systemu „env” na „test” przed wiosną jest ładowany w górę? Ponieważ za pomocą MethodInvokingFactoryBean będzie tylko ustawić go potem z jakiegoś powodu, nawet jeśli ustawić go przed załadowaniem moje pliki własności:

<bean id="systemPrereqs" 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" value="#{@systemProperties}" /> 
    <property name="targetMethod" value="putAll" /> 
    <property name="arguments"> 
     <!-- The new Properties --> 
     <util:properties> 
      <prop key="env">test</prop> 
     </util:properties> 
    </property> 
</bean> 

<bean 
    class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
    <property name="searchContextAttributes" value="true" /> 
    <property name="contextOverride" value="true" /> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="locations"> 
     <list> 
      <value>classpath:application.properties</value> 
      <value>classpath:${env}.properties</value> 
      <value>${config}</value> 
     </list> 
    </property> 
</bean> 

<bean id="managerDataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="username"> 
     <value>${database.username}</value> 
    </property> 
    <property name="password"> 
     <value>${database.password}</value> 
    </property> 
    <property name="url"> 
     <value>${database.url}</value> 
    </property> 

</bean> 

z właściwości bazy danych zdefiniowanych wewnątrz application.properties, production.properties i test.properties.

Chodzi o to, oczywiście, że chcę użyć tego samego pliku kontekstowego dla wszystkich środowisk, w przeciwnym razie mógłbym tylko powiedzieć, że mój test użył innego kontekstu, w którym ustawiłem właściwość PropertyPlaceholder "location" na test.properties .. Chcę jednak, aby moje testy obejmowały także mój kontekst, aby wszelkie błędy zostały wykryte tak wcześnie, jak to tylko możliwe (przeprowadzam kompleksowe testy naszej aplikacji internetowej za pomocą narzędzia spring-web-mvc, które ładuje całą aplikację internetową, miłe opinie i nie chcę tego stracić).

Do tej pory jedynym sposobem widzę może być skonfigurowanie runner JUnit zawierać pewną właściwość systemu ustalania argumentu, choć nie wiem, jak to zrobić ..

+0

powiedziałbym profile stosowany w tych profilach importować właściwa pliki, których potrzebujesz. Wygląda na to, że wymyślasz koło. Z profilem możesz po prostu dodać "@ ActiveProfiles" do swojego testu, aby załadować właściwe rzeczy. Zamiast "-Denv = test" użyjesz '-Dspring.active.profiles = test' –

Odpowiedz

33

Pracuję na dokładnie takie same problem teraz i miejmy nadzieję znaleźć drogę. Możesz zadzwonić pod numer System.setProperty() do statycznego inicjalizatora swojego testu.

+0

Cool, works! Dzięki! :) – Pete

+1

Chociaż będzie to działać podczas uruchamiania pojedynczego testu, niekoniecznie będzie działać podczas uruchamiania wielu testów, ponieważ kontekst Spring może być ponownie użyty w wielu testach. – pimlottc

+0

@pimlottc, IMHO wykonujące wiele testów nie powoduje żadnych problemów w tym przypadku. Połów jest taki, że musimy ustawić właściwość systemu przed inicjalizacją kontekstu sprężyny. Osiąga się to za pomocą statycznego inicjalizatora. Jeśli wszystkie przypadki testowe, które mają ten sam kontekst sprężyny, ustawiają tę właściwość (w tym przypadku) kontekst sprężyny zostanie poprawnie zainicjowany. – AlexR

16

W środowisku Eclipse kliknij prawym przyciskiem myszy klasę testową JUnit, wybierz opcję Uruchom jako> Uruchom konfiguracje ..., a następnie przejdź do karty Argumenty, a w obszarze Argumenty maszyn wirtualnych dodaj wpis właściwości systemu, np. -Dcatalina.base = C: \ Programy \ apache-tomcat-7.0.32

+3

Czy jest jakiś sposób, aby to zrobić dla wszystkich testów domyślnie, więc nie musisz ręcznie ustawiać tej właściwości dla każdego testu? – Stewart

0

Można spróbować użyć atrybutu depends-on mieć metoda wywoływania bieg fasoli przed innymi