2009-03-11 8 views
17

Pour exécuter mes tests unitaires sur mon Eclipse, j'ai besoin de définir certaines propriétés pour la machine virtuelle. Ainsi, lorsque je lance mon test JUnit pour la première fois, je vais dans "Open Run Dialog", puis dans ma configuration JUnit pour ce test, je vais dans l'onglet "Arguments" et mets tout ce dont j'ai besoin dans les "arguments VM" zone de texte.Ajouter automatiquement des propriétés lors de l'exécution de JUnit dans Eclipse

Existe-t-il un moyen d'ajouter automatiquement un ensemble de propriétés quand je lance mon JUnit, donc je ne pourrai que cliquer avec le bouton droit sur la classe de test et cliquer sur "Exécuter en tant que test Junit" ?

Informations techniques: Eclipse 3.3.2, JUnit 4, Java 5


Modifier, en ce qui concerne la réponse de Aaron Digulla:

Ces propriétés sont utilisées dans les fichiers de configuration Spring *. Ainsi, je ne peux pas utiliser l'idée donnée par Aaron, car Spring sera initialisé avant l'exécution du test.

En plus de cela, j'ai juste besoin de savoir si je peux y arriver facilement dans Eclipse. La solution ne doit donc pas avoir d'impact sur la compilation de l'application en dehors d'Eclipse car mon application sera finalement compilée (et testée) par Maven2.

* peu de tests «unitaires» ont en effet besoin de ma configuration Spring pour fonctionner. Ok, je sais que ce ne sont pas de vrais tests unitaires; o)

Édition 2: En fait, je commençais en effet la configuration Spring par une unité de test. Ainsi, avant de démarrer Spring, je vérifie les propriétés du système, et si mes propriétés ne sont pas définies, je leur donne la valeur requise ...

Cependant, je suis un peu déçu que Eclipse ne puisse pas faire ça pour moi automatiquement ...

+0

Pour être explicite en ce qui concerne les tests de printemps. Ce dont parle OP lors de l'utilisation de Spring est "RunWith (SpringJUnit4ClassRunner.class) et ContextConfiguration" commencera au printemps avant que les junit Before et BeforeClass ne soient frappées, donc la définition des propriétés du système ne fonctionnera pas. – sMoZely

Répondre

7

Ma solution est de créer une classe de base de test abstraite pour tous les tests dans un projet qui étend TestCase. Il doit être abstrait, donc le localisateur d'essai automatique ne le prendra pas en compte.

Dans le bloc de code statique de cette classe, je définis toutes les propriétés dont j'ai besoin. Cela garantit que le code s'exécute une fois et qu'une seule fois et qu'il s'exécute avant tout test dans mon projet. [EDIT] Vous dites que Spring est initialisé avant l'exécution des tests. C'est un bug dans votre projet: ce doivent être les tests qui initialisent Spring. Sinon, vous rencontrerez toujours le problème que vous devez tester quelque chose hors de votre contrôle. Par conséquent, je suggère de déplacer le code de démarrage Spring dans un endroit où vous pouvez l'appeler au moment où l'environnement est prêt.

Vous pouvez également vérifier que l'environnement est correctement configuré dans setUp() et renvoyer une erreur si une propriété est manquante. De cette façon, vous saurez au moins pourquoi les tests échoueront plus tard. Mais je préfère toujours avoir un contrôle total sur le sous-système qui prend vie. Tout le reste ne demande qu'un désastre.

+0

Je ne peux pas utiliser votre idée, comme expliqué dans mon Edit (je ne le downvote pas car ce n'est pas une mauvaise idée, cependant) ... – romaintaz

+2

Je suis d'accord avec le code de blocage statique init. Il existe une autre alternative: @BeforeClass sur une méthode où vous pouvez init vos variables système. – zeratul021

7

Quand je veux définir certaines propriétés entrées pour mon test JUnit je mets en œuvre les éléments suivants

protected void setUp() throws Exception { 
     super.setUp(); 

     System.setProperty("Property1", "value1"); 
     System.setProperty("Property2", "value2"); 
} 

Les propriétés sont définies avant la Methode de test est appelé

EDIT: Vous pouvez également lire les propriétés depuis un fichier et vers les propriétés système

+0

Même remarque que pour Aaron Digulla. Cela ne fonctionnera pas si les propriétés sont utilisées par Spring ... – romaintaz

+0

Vous devez initialiser toutes les valeurs et les objets dans la méthode d'installation. Sinon, mettez à jour les cas de test. –

1

Je n'ai jamais compris pourquoi les configurations de lancement ont un moyen de définir des variables d'environnement mais la seule façon d'ajouter une propriété système semble être d'ajouter des arguments vm . La façon dont j'ai travaillé autour de ceci est d'avoir des tests (ou une classe de base de tests abstraite) testant la présence des propriétés requises, s'ils n'y sont pas alors je les charge à partir d'un fichier .properties sur le chemin de classe .

Cela fonctionne comme je peux encore les remplacer ou les spécifier à partir de ANT ou Maven, mais peut également «clic droit» -> Exécuter en tant que -> Junit Testez les fichiers de test individuels.

modifier: voici un exemple d'obtenir du printemps pour éventuellement charger un fichier de propriétés de la même manière que décrit ci-dessus:

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location" value="database.properties"/> 
     <property name="ignoreResourceNotFound" value="true" /> 
     <property name="systemPropertiesMode"> 
      <util:constant static-field="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
     </property> 
</bean> 
26

Vous pouvez essayer - aller à

Window->Preferences->Java->Installed JREs 

ans select la machine virtuelle Java en cours d'utilisation, que de mettre un «par défaut VM» comme le paramètre

-DrunningInEclipse 

Que vous pouvez vérifier à partir de au sein de votre TestCase:

System.getProperty("runningInEclipse") != null 
+0

Ça marche! Génial! – Wolfgang

+0

Fantastique! Merci. –

+0

Existe-t-il un moyen de spécifier cela par projet? – Stewart

1

CONVENUS méthode utilisée de cette manière dans un de mes tests JUnit et cela a fonctionné

 


    @BeforeClass 
     public static void setupProperties() { 
      System.setProperty("catalina.base", "C:\\sam-tomcat-7.0.42"); 
     } 

+0

Je connais cette solution, mais elle n'a pas respecté mes exigences. Je voulais avoir une solution uniquement pour Eclipse. En utilisant ceci, cela aura un impact sur la construction "par défaut" de Maven (c'est-à-dire en dehors de l'EDI). De plus, cela ne fonctionne que pour une classe (ou vous devez faire en sorte que tous vos tests étendent la classe qui définit ce '' BeforeClass'). – romaintaz

Questions connexes