web-dev-qa-db-fra.com

Fichier de propriétés Spring jUnit Testing

J'ai un test jUnit qui a son propre fichier de propriétés (application-test.properties) et son fichier de configuration printanier (application-core-test.xml).

L'une des méthodes utilise un objet instancié par spring config et qui est un composant spring. L'un des membres des classes tire sa valeur de application.properties, notre fichier de propriétés principal. Lors de l'accès à cette valeur via jUnit, il est toujours nul. J'ai même essayé de changer le fichier de propriétés pour qu'il pointe vers le fichier de propriétés réel, mais cela ne semble pas fonctionner.

Voici comment j'accède à l'objet du fichier de propriétés

@Component
@PropertySource("classpath:application.properties")
public abstract class A {

    @Value("${test.value}")
    public String value;

    public A(){
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    }

    public A(String text) {
        this();
        // do something with text and value.. here is where I run into NPE
    }

}

public class B extends A { 
     //addtnl code

    private B() {

    }


    private B(String text) {
         super(text)
    }
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:META-INF/spring/application-core-test.xml",
                             "classpath:META-INF/spring/application-schedule-test.xml"})
@PropertySource("classpath:application-test.properties")
public class TestD {

    @Value("${value.works}")
    public String valueWorks;

    @Test
    public void testBlah() {     
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        B b= new B("blah");
        //...addtnl code

    }    
}      
16
user1707141

Tout d’abord, application.properties dans @PropertySource doit indiquer application-test.properties si c'est le nom du fichier (il est important de faire correspondre ces choses):

@PropertySource("classpath:application-test.properties ")

Ce fichier devrait être sous votre /src/test/resources classpath (à la racine).

Je ne comprends pas pourquoi vous spécifiez une dépendance codée en dur dans un fichier nommé application-test.properties. Ce composant doit-il uniquement être utilisé dans l'environnement de test?

La chose normale à faire est d'avoir des fichiers de propriétés avec le même nom sur différents chemins de classes. Vous chargez l’un ou l’autre selon que vous exécutez ou non vos tests.

Dans une application typique, vous auriez:

src/test/resources/application.properties

et

src/main/resources/application.properties

Et puis injectez-le comme ça:

@PropertySource("classpath:application.properties")

La meilleure chose à faire serait d'exposer ce fichier de propriétés comme un haricot dans votre contexte de printemps, puis de l'injecter dans tout composant qui en a besoin. De cette manière, votre code n'est pas encombré de références à application.properties et vous pouvez utiliser ce que vous voulez comme source de propriétés. Voici un exemple: comment lire le fichier de propriétés dans le projet Spring?

32
Robert Moskal

En ce qui concerne les tests, vous devez utiliser Spring 4.1 pour écraser les propriétés définies à d’autres endroits:

@TestPropertySource("classpath:application-test.properties")

Les sources de propriété de test ont une priorité plus élevée que celles chargées à partir de l'environnement du système d'exploitation ou Java). Les propriétés système ainsi que les sources de propriété ajoutées par l'application comme @PropertySource

21
sendon1982