2017-10-08 2 views
0

Dans certains cas, le logiciel doit se comporter différemment en fonction de certaines conditions environnementales, par exemple si un fichier existe à un endroit ou non. Dans mon cas, je développe une bibliothèque, et elle est configurée en fonction d'un fichier de configuration dans classpath, (et revient au comportement par défaut si le fichier de configuration n'existe pas).Unité Test avec comportement différent sur l'existence d'un fichier

Comment dois-je tester cette classe? J'ai besoin d'écrire des tests pour évaluer la classe dans les cas suivants:

  • le fichier n'existe pas sur classpath
  • le fichier avec le contenu A existe sur classpath
  • le fichier avec le contenu B existe sur classpath

Mais je ne sais pas comment configurer l'environnement pour les justifier tous. Et exécutez le test l'un après l'autre. En passant, j'utilise Java, et j'ai JUnit et TestNG sur le classpath de test.


Edit: L'un des problèmes est que le fichier de configuration réside dans classpath, donc si les ClassLoader normales découvertes et charges, il retourne le même contenu tant que le même chargeur de classe est utilisée. Et je crois que l'utilisation d'un ClassLoader personnalisé pour les tests est si compliquée qu'il faut des tests pour valider les tests!

+1

S'il vous plaît consulter notre [SO checklist] (http://meta.stackoverflow.com/questions/260648/stack- overflow-question-checklist) pour vous aider à poser une bonne question, et ainsi obtenir une bonne réponse. –

+0

Conservez l'environnement (système de fichiers, variables d'environnement, réseau, heure/date, bases de données) hors de vos tests unitaires. C'est une douleur. Juste se moquer de tout. – Robert

+0

@Robert Je veux faire ça, mais qu'en est-il de l'environnement de production? Dans le déploiement cible, je dois vérifier l'existence d'un fichier de chemin de classe. N'est-il pas requis le comportement sur les tests aussi? –

Répondre

1

Vous pouvez utiliser un fichier temporaire créé par votre test pour simuler le chemin de votre classe.

ConfigurationTest.java:

import static org.hamcrest.Matchers.*; 
import static org.junit.Assert.*; 
import static org.junit.Assume.assumeThat; 

import java.nio.file.Files; 
import org.junit.Test; 

public class ConfigurationTest { 

    private Configuration config = new Configuration(); 

    @Test 
    public void testWithConfigFile() throws Exception { 
     config.configFile = Files.createTempFile("config_",".ini"); 
     config.configFile.toFile().deleteOnExit(); 
     assertFalse(config.isInDefaultMode()); 
    } 
    @Test 
    public void testWithoutConfigFile() throws Exception { 
     assumeThat(Files.exists(config.configFile), is(false)); 
     assertTrue(config.isInDefaultMode()); 
    } 
} 

Configuration.java:

import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

public class Configuration { 

    Path configFile = Paths.get("config.ini"); 

    public boolean isInDefaultMode() { 
     return !Files.exists(configFile); 
    } 
}