Question

J'ai récemment trouvé une solution qui me permet de charger les propriétés du système pour mes tests unitaires. Il fonctionne très bien si je suis en cours d'exécution d'un test individuel, mais si je choisis d'exécuter toute la suite de test, il échoue. Quelqu'un peut-il me dire pourquoi?

La première étape consiste à charger le contexte applicatif de test:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/applicationContext-test.xml")

L'étape suivante consiste à créer une classe qui chargera les propriétés du système:

import java.io.InputStream;
import java.util.Properties;

import javax.annotation.PostConstruct;

import org.springframework.core.io.Resource;

public class SystemPropertiesLoader{

    private Resource resource;

    public void setResource(final Resource resource){
        this.resource = resource;
    }

    @PostConstruct
    public void applyProperties() throws Exception{

        final Properties systemProperties = System.getProperties();

        final InputStream inputStream = resource.getInputStream();

        try{
            systemProperties.load(inputStream);
        } finally{
            inputStream.close();
        }
    }
}

La dernière étape consiste à inscrire sur la liste comme un haricot dans mon contexte d'application de test:

<bean class="com.foo.SystemPropertiesLoader">
    <property name="resource" value="classpath:localdevelopment_Company.properties" />
</bean>

Quand je lance la suite de tests, plusieurs de mes tests, tous qui reposent sur les propriétés du système, l'échec. Si je vais à l'épreuve spécifique et l'exécuter, il passera. Je l'ai débogués et je l'ai vérifié que le code dans SystemPropertiesLoader est en cours d'exécution, et tous les autres haricots sont tirés avec succès à partir du contexte. Cependant, les propriétés ne sont pas correctement chargées d'être, car ils sont tous nuls à venir lorsque je tente d'y accéder. Toutes les suggestions?

Était-ce utile?

La solution 2

Le problème était en fait que les valeurs de la classe des propriétés ont été définies de manière statique. Alors, voici le cas qui a cassé la solution:

  1. Test A est lancé. Test A ne se charge pas applicationContext-test.xml mais fait appel en code qui utilise des valeurs de la classe Propriétés.
  2. Maintenant, toutes les valeurs de la classe Properties sont définis de façon permanente.
  3. test B est exécuté. charges d'essai B applicationContext-test.xml.
  4. Le SystemPropertiesLoader est exécuté, les valeurs de chargement dans les propriétés du système.
  5. Une valeur est extraite de la classe Properties, mais comme ils ont été définis de manière statique et affecté précédemment, les valeurs des propriétés du système ne sont jamais là-dedans.

En fin de compte, la meilleure solution est de définir des valeurs par défaut dans la classe Propriétés.

Autres conseils

Quelques idées:

  1. Si vous êtes tests unitaires, alors pourquoi ne pas définir les propriétés requises dans chaque cas de test individuel. Il n'y a pas de point à l'aide du printemps pour définir une variable globale.
  2. Pourquoi utilisez-vous des propriétés du système. Spring gère la propriété des objets que vous pouvez vous injecter dans les haricots. Ils peuvent être installés dans le appContext.xml et aussi y initialisés (voir: PropertyPlaceHolderConfigurer) en utilisant les propriétés du système. Avoir votre accès au code des propriétés du système est contre la philosophie même du printemps.
  3. Définition des propriétés du système à partir d'un fichier est assez mal de toute façon. Normalement, vous utilisez les propriétés système pour remplacer les paramètres dans le fichier de propriétés.

Serait-il possible que chacun de vos cas de test fraie une nouvelle machine virtuelle Java, et les propriétés System ne sont pas fixés pour chaque test?

Peut-être essayer de tirer parti des méthodes de setUp() et tearDown() dans votre classe de test JUnit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top