Hoe omgevingsvariabele of systeemeigenschap instellen in voorjaarstests?

Ik zou graag wat tests willen schrijven die de XML Spring-configuratie van een geïmplementeerde WAR controleren. Helaas vereisen sommige bonen dat sommige omgevingsvariabelen of systeemeigenschappen worden ingesteld. Hoe kan ik een omgevingsvariabele instellen voordat de lentebonen worden geïnitialiseerd wanneer ik de handige teststijl gebruik met @ContextConfiguration?

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }

Als ik de applicatiecontext configureer met annotaties, zie ik geen hook waar ik iets kan doen voordat de springcontext is geïnitialiseerd.


Antwoord 1, autoriteit 100%

U kunt de eigenschap System initialiseren in een statische initializer:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext {
    static {
        System.setProperty("myproperty", "foo");
    }
}

De statische initialisatiecode wordt uitgevoerd voordat de context van de lentetoepassing wordt geïnitialiseerd.


Antwoord 2, autoriteit 71%

De juiste manier om dit te doen, te beginnen met Spring 4.1, is door een @TestPropertySourceannotatie te gebruiken.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
@TestPropertySource(properties = {"myproperty = foo"})
public class TestWarSpringContext {
    ...    
}

Zie @TestPropertySource in de Spring-documentenen Javadocs.


Antwoord 3, autoriteit 12%

Je kunt ook een test ApplicationContextInitializer gebruiken om een ​​systeemeigenschap te initialiseren:

public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext)
    {
        System.setProperty("myproperty", "value");
    }
}

en configureer het vervolgens in de testklasse naast de Spring-contextconfiguratiebestandslocaties:

@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...)
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeTest
{
...
}

Op deze manier kan codeduplicatie worden vermeden als een bepaalde systeemeigenschap moet worden ingesteld voor alle unit-tests.


Antwoord 4, autoriteit 10%

Alle antwoorden hier hebben momenteel alleen betrekking op de systeemeigenschappen die verschillen van de omgevingsvariabelen die moeilijker in te stellen zijn, in het bijzonder. voor testen. Gelukkig kan de onderstaande klas daarvoor worden gebruikt en de klasdocumenten hebben goede voorbeelden

EnvironmentVariables.html

Een snel voorbeeld uit de documenten, aangepast om te werken met @SpringBootTest

@SpringBootTest
public class EnvironmentVariablesTest {
   @ClassRule
   public final EnvironmentVariables environmentVariables = new EnvironmentVariables().set("name", "value");
   @Test
   public void test() {
     assertEquals("value", System.getenv("name"));
   }
 }

Antwoord 5, autoriteit 5%

Als u wilt dat uw variabelen geldig zijn voor alle tests, kunt u een bestand application.propertiesin uw directory met testbronnen hebben (standaard: src/test/resources) die er ongeveer zo uit zal zien:

MYPROPERTY=foo

Hierdoor wordt ze geladen en gebruikt, tenzij u definities heeft via @TestPropertySourceof een vergelijkbare methode – de exacte volgorde waarin de eigenschappen zijn geladen in de veerdocumentatie Hoofdstuk 24. Geëxternaliseerde configuratie .


Antwoord 6, Autoriteit 2%

U kunt de systeemeigenschappen als VM-argumenten instellen.

Als uw project een Maven-project is, kunt u de volgende opdracht uitvoeren tijdens het uitvoeren van de testklasse:

mvn test -Dapp.url="https://stackoverflow.com"

Testklasse:

public class AppTest  {
@Test
public void testUrl() {
    System.out.println(System.getProperty("app.url"));
    }
}

Als u individuele testklasse of methode in Eclipse wilt uitvoeren, dan:

1) Ga naar Run – & GT; Uitvoeren van configuratie

2) Selecteer aan de linkerkant Selecteer uw testklasse onder de JUNIST-sectie.

3) Doe het volgende:


Antwoord 7, Autoriteit 2%

Voor eenheidstests wordt de systeemvariabele niet geïnstantieerd, maar wanneer ik “MVN Clean Install” doen omdat er geen server is die de toepassing uitvoert. Dus om het systeemeigenschappen in te stellen, moet ik het doen in POM.XML. Zoals SO:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.21.0</version>
    <configuration>
        <systemPropertyVariables>
            <propertyName>propertyValue</propertyName>
            <MY_ENV_VAR>newValue</MY_ENV_VAR>
            <ENV_TARGET>olqa</ENV_TARGET>
            <buildDirectory>${project.build.directory}</buildDirectory>
        </systemPropertyVariables>
    </configuration>
</plugin>

Antwoord 8

Voor SpringBoot, hier zou de eenvoudigste manier zijn om het naar mijn mening te doen, gebruik de @SpringBootTestannotatie die je kunt in Java:

@SpringBootTest(
    properties = { "spring.application.name=example", "ENV_VARIABLE=secret" }
)
public class ApplicationTest {
    // Write your tests here
}

of in Kotlin kun je doen:

@SpringBootTest(
    properties = ["spring.application.name=example", "ENV_VARIABLE=secret"]
)
internal class ApplicationKTest {
    // Write your tests here
}

En dat is het dat uw test moet worden uitgevoerd om de eigenschappen te beheren met degene die u hebt definiëren in de annotatie.
Laten we zeggen dat je een application.ymleruit zien:

spring:
  application:
    name: "app"
db:
  username: "user"
  password: ${ENV_VARIABLE:default}

Tijdens de test zou het zijn:

  • De veerbezit spring.application.nameretourneert de waarde "example"
  • De omgevingsvariabele ENV_VARIABLEKOMT "secret", dus als u de waarde db.passwordin uw code gebruikt, zou het "secret".

Antwoord 9

Als u veel testklassen hebt (het testt dat het opstarten van Tomcat / Server) en de tests falen, moet u de eigenschap van het systeem gebruiken
System.SetProperty (“CCM.Configs.dir”, ConfigPath);
Aangezien u ervoor moet zorgen dat deze is ingesteld voordat de lente begint, moet u het in een statische context in een klasse plaatsen.
En om er zeker van te zijn dat elke test die ervan afhankelijk kan zijn deze ingestelde systeemeigenschap krijgt, definieert u een eenvoudige configuratieklasse in uw testmap om die variabele in te stellen. PS in mijn geval was de env-variabele die nodig was “ccm.configs.dir”
Dit is wat ik heb toegevoegd aan mijn testmap,

@Configuration
public class ConfigLoader {
  static {
    System.setProperty("ccm.configs.dir", "path/to/the/resource");
  }
}

En al mijn integratietestklassen waren in staat om die variabele al ingesteld te krijgen tegen de tijd dat ze worden uitgevoerd.

Other episodes