it-swarm.com.de

@TestPropertySource funktioniert nicht für JUnit-Tests mit AnnotationConfigContextLoader in Spring 1.2.6

Es scheint, dass nichts, was ich in Spring 4.1.17 mit Spring Boot 1.2.6.RELEASE mache, überhaupt funktioniert. Ich möchte nur auf die Anwendungseigenschaften zugreifen und sie bei Bedarf mit test überschreiben (ohne den Hack zu verwenden, um eine PropertySource manuell einzufügen)

das geht nicht ..

@TestPropertySource(properties = {"elastic.index=test_index"})

noch tut dies ..

@TestPropertySource(locations = "/classpath:document.properties")

noch das ..

@PropertySource("classpath:/document.properties")

vollständiger Testfall ..

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
@TestPropertySource(properties = {"elastic.index=test_index"})
public class PropertyTests {
    @Value("${elastic.index}")
    String index;

    @Configuration
    @TestPropertySource(properties = {"elastic.index=test_index"})
    static class ContextConfiguration {
    }

    @Test
    public void wtf() {
        assertEquals("test_index", index);
    }
}

ergebend

org.junit.ComparisonFailure: 
Expected :test_index
Actual   :${elastic.index}

Es scheint eine Menge widersprüchlicher Informationen zwischen 3.x und 4.x zu geben, und ich kann nichts finden, was mit Sicherheit funktioniert.

Jeder Einblick wäre dankbar. Prost!

25
Thomas Beauvais

Es stellt sich heraus, dass der beste Weg (bis Spring dieses Versehen behebt) ein PropertySourcesPlaceholderConfigurer ist, das test.properties (oder was auch immer Sie wollen) und @Import Einbringt oder dieses @Configuration Erweitert. .

import org.Apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import Java.io.IOException;

@Configuration
public class PropertyTestConfiguration {
    @Bean
    public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer() throws IOException {
        final PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        ppc.setLocations(ArrayUtils.addAll(
                        new PathMatchingResourcePatternResolver().getResources("classpath*:application.properties"),
                        new PathMatchingResourcePatternResolver().getResources("classpath*:test.properties")
                )
        );

        return ppc;
    }

}

Auf diese Weise können Sie Standardeinstellungen in application.properties definieren und in test.properties überschreiben. Wenn Sie über mehrere Schemata verfügen, können Sie die Klasse PropertyTestConfiguration natürlich nach Bedarf konfigurieren.

Und verwenden Sie dies in einem Unit-Test.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public class PropertyTests {
    @Value("${elastic.index}")
    String index;

    @Configuration
    @Import({PropertyTestConfiguration.class})
    static class ContextConfiguration {
    }
}
14
Thomas Beauvais

Ich habe die locations -Eigenschaft von @TestPropertySource Verwendet, um Eigenschaften zu überschreiben (oder hinzuzufügen).

Das hat bei mir geklappt (Frühjahr 4.2.4):

@TestPropertySource(locations = {
   "classpath:test.properties",
   "classpath:test-override.properties" })

Übergeordnete Eigenschaften wie die folgenden haben dies jedoch nicht getan:

@TestPropertySource(
  locations = {"classpath:test.properties"},
  properties = { "key=value" })

Obwohl der Javadoc sagt, dass diese Eigenschaften die höchste Priorität haben. Ein Bug vielleicht?

Update

Der Fehler sollte in Spring Boot Version 1.4.0 und höher behoben sein. Siehe Festschreiben, wodurch das Problem geschlossen wird . Inzwischen sollten Eigenschaften, die auf die angegebene Weise deklariert wurden, Vorrang haben.

14

Für die Verwendung von @Value ist eine PropertySourcesPlaceholderConfigurer-Bean erforderlich, um ${...} - Platzhalter aufzulösen. Die akzeptierte Antwort finden Sie hier: @ Wert nicht über den von Java konfigurierten Testkontext festgelegt

6
Don Bottstein

Bei mir hat @TestPropertySource ("classpath: xxxxxxxx.properties") funktioniert

4
Swarit Agarwal

Haben Sie versucht, @PropertySource("classpath:document.properties") oder @PropertySource("classpath*:document.properties") zu verwenden?

3
user2004685

Ich hatte ein Problem mit @TestPropertySource. test.properties nicht gefunden

unten ist der vorher festgelegte

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ExtContext.class)
@TestPropertySource(locations = "classpath: test.properties")

ich habe das Leerzeichen zwischen classpath: und test.properties wie folgt entfernt

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ExtContext.class)
@TestPropertySource(locations = "classpath:test.properties")

Dies hat bei mir funktioniert, wenn test.properties nicht in classpth gefunden wird. Ich kann auch für Sie arbeiten

1
S.Sriniavasulu