Ustaw właściwość systemową dla JUnit Runner (Eclipse), aby przetestować Spring Web App

Nasza aplikacja internetowa wykorzystuje SystemPropertyPlaceholder do ładowania plików właściwości w zależności od wartości właściwości systemu (patrz poniżej)

Domyślna konfiguracja do lokalnego uruchamiania jest przechowywana wapplication.properties. Na serwerze produkcyjnym obecnie ustawiamy „env” na „produkcja” przed wdrożeniem aplikacji i zostanie ona załadowanaproduction.properties.

Teraz do testowania aplikacji atest.properties plik powinien być używany.

Jeśli uruchomię wszystkie testy, powiedzmy w naszej kompilacji Jenkinsa, dodając-Denv=test będzie działać zgodnie z oczekiwaniami. Ale co, jeśli chcę uruchomić pojedynczy test w Eclipse ze zintegrowanym biegaczem JUnit?

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

Czy jest jakiś sposób, aby powiedzieć o moim teście, powinien ustawić właściwość systemu „env” na „test” PRZED załadowaniem wiosny? Ponieważ używamMethodInvokingFactoryBean ustawi go później z jakiegoś powodu, nawet jeśli ustawię go przed załadowaniem plików 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ściami bazy danych zdefiniowanymi wewnątrz application.properties, production.properties i test.properties.

Chodzi oczywiście o to, że chcę używać tego samego pliku kontekstowego dla wszystkich środowisk, w przeciwnym razie mógłbym po prostu powiedzieć mojemu testowi, aby użył innego kontekstu, w którym ustawiłem właściwość PropertyPlaceholder „location” na test.properties ... Ale chcę moje testy obejmują również mój kontekst, tak aby wszelkie błędy zostały wykryte tak wcześnie, jak to możliwe (robię testy końcowe na naszej aplikacji internetowej za pomocą spring-web-mvc, który ładuje całą aplikację internetową, dostarczając tam miłych komentarzy Nie chcę tego stracić).

Jak dotąd jedynym sposobem, w jaki mogę zobaczyć, może być skonfigurowanie biegacza JUnit tak, aby zawierał jakiś argument ustawień właściwości systemu, chociaż nie wiem, jak to zrobić ..

questionAnswers(3)

yourAnswerToTheQuestion