[java] Füllen von Spring @ Value während des Komponententests


Answers

Seit Frühjahr 4.1 konnten Sie Eigenschaftswerte nur im Code org.springframework.test.context.TestPropertySource indem org.springframework.test.context.TestPropertySource Annotation org.springframework.test.context.TestPropertySource auf der Klassenebene Unit Tests verwendeten. Sie können diesen Ansatz auch für das Injizieren von Eigenschaften in abhängige Bean-Instanzen verwenden

Beispielsweise

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FooTest.Config.class)
@TestPropertySource(properties = {
    "some.bar.value=testValue",
})
public class FooTest {

  @Value("${some.bar.value}")
  String bar;

  @Test
  public void testValueSetup() {
    assertEquals("testValue", bar);
  }


  @Configuration
  static class Config {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertiesResolver() {
        return new PropertySourcesPlaceholderConfigurer();
    }

  }

}

Hinweis: Es ist notwendig, eine Instanz von org.springframework.context.support.PropertySourcesPlaceholderConfigurer im Spring-Kontext zu haben

Edit 24-08-2017: Wenn Sie SpringBoot 1.4.0 und höher verwenden, können Sie Tests mit @SpringBootTest und @SpringBootConfiguration Annotationen initialisieren. Mehr Infos here

Im Falle von SpringBoot haben wir folgenden Code

@SpringBootTest
@SpringBootConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = {
    "some.bar.value=testValue",
})
public class FooTest {

  @Value("${some.bar.value}")
  String bar;

  @Test
  public void testValueSetup() {
    assertEquals("testValue", bar);
  }

}
Question

Ich versuche, einen Komponententest für eine einfache Bean zu schreiben, der in meinem Programm verwendet wird, um Formulare zu validieren. Die Bean ist mit @Component und hat eine Klassenvariable, die mit @Value("${this.property.value}") private String thisProperty; initialisiert wird. @Value("${this.property.value}") private String thisProperty;

Ich würde Unit-Tests für die Validierungsmethoden innerhalb dieser Klasse schreiben, wenn möglich möchte ich dies tun, ohne die Eigenschaftendatei zu verwenden. Meine Überlegungen dahinter sind, dass sich der Wert, den ich aus der Eigenschaftendatei gezogen habe, nicht auf meinen Testfall auswirkt. Mein Testfall testet den Code, der den Wert überprüft, nicht den Wert selbst.

Gibt es eine Möglichkeit, Java-Code in meiner Testklasse zu verwenden, um eine Java-Klasse zu initialisieren und die Spring @ Value-Eigenschaft in dieser Klasse aufzufüllen und sie dann zum Testen zu verwenden?

Ich habe dieses How To gefunden , das scheint nah zu sein, aber verwendet immer noch eine Eigenschaftendatei. Ich würde lieber alles Java-Code sein.

Vielen Dank




Das scheint zu funktionieren, obwohl es immer noch ein wenig wortreich ist (ich hätte gerne noch etwas kürzer):

@BeforeClass
public static void beforeClass() {
    System.setProperty("some.property", "<value>");
}

// Optionally:
@AfterClass
public static void afterClass() {
    System.clearProperty("some.property");
}



Related