web-dev-qa-db-fra.com

Configuration correcte de Spring Boot 2 et de JUnit 5

Utilisation de Spring Boot 2.0.0.RC2.

J'ai écrit une classe de configuration:

@Configuration
@ConditionalOnProperty("launchdarkly.sdkKey")
public class LDClientConfiguration  {

    @Bean
    public LDClientInterface ldClient(LDClientConfigurationProperties props) {
        return new LDClient(props.getSdkKey(), props.getLDConfig());
    }
}

Et une classe ConfigurationProperties:

@Component
@ConfigurationProperties(prefix = "launchdarkly")
public class LDClientConfigurationProperties {

    private String sdkKey;
    // more attributes

    public void setSdkKey(String sdkKey) {
        this.sdkKey = sdkKey;
    }
    // more setters

    public LDConfig getLDConfig() {
        LDConfig.Builder builder = new LDConfig.Builder();
        // set builder w/ attributes
        return builder.build();
    }
}

J'essaie de tester cela, en lisant la configuration de src/test/resources/application-test.yml:

launchdarkly:
    sdkKey: <redacted>

J'ai les dépendances suivantes:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>${junit-jupiter.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit-jupiter.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-params</artifactId>
        <version>${junit-jupiter.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-engine</artifactId>
        <version>${junit-platform.version}</version>
        <scope>test</scope>
    </dependency>

Et junit-platform-surefire-provider est configuré dans maven-surefire-plugin v2.19.1

Je n'arrive pas à trouver les annotations appropriées pour que mes classes de test lisent la configuration à partir de src/test/resources/application-test.yml.

J'ai lu https://junit.org/junit5/docs/current/user-guide mais n'arrive toujours pas à obtenir les annotations correctes. Toute aide serait appréciée.

edit: classe de test

@SpringJUnitConfig(SpringBootContextLoader.class)
public class LDClientConfigurationPropertiesTest {

    @Autowired
    private LDClientConfigurationProperties props;

    @Test
    public void test() {
        LDConfig config = props.getLDConfig();
        assertThat(config, notNullValue());
    }
}

Si j'annote la classe avec @ExtendWith(SpringExtension.class) Et @SpringBootTest, le système essaie de charger com/company/spring/launchdarkly/LDClientConfigurationTest-context.xml, puis com/company/spring/launchdarkly/LDClientConfigurationTestContext.groovy mais ne recherche pas de fichier yml.

4
Eric

Les annotations appropriées pour les tests d'intégration Spring Boot 2 et JUnit 5 sont les suivantes (en Kotlin):

@ExtendWith(SpringExtension::class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("dev") // optional
@TestInstance(TestInstance.Lifecycle.PER_CLASS) // optional

Vous pouvez obtenir le port sur lequel le service est exécuté via l'annotation @LocalServerPort sur un champ.

1
tmlye