Comment l'unité de test java principale méthode?
J'ai une classe à laquelle je dois passer 2 arguments par le biais de sa méthode principale, si elle est adoptée en moins de 2 args, il affiche un message d'erreur du système. J'ai écrit un test unitaire pour la méthode main ici, quand je lance le test, il s'arrête à "l'exécution" (montre ni le succès, ni l'échec). S'il vous plaît suggérer.
Example.java
public class Example
{
private static String str1 = null;
private static String str2 = null;
public static void main(String[] args)
{
if( args.length != 2 )
{
call();
}
Example ex = new Example(args[0], args[1]);
ex.getData();
}
public Example(String str1, String str2)
{
Example.str1 = str1;
Example.str2 = str2;
}
public void getData(){
System.out.println("Name is: "+str1);
System.out.println("City is: "+str2);
}
private static void call()
{
System.err.println("Usage: String1 String2");
System.err.println("Where: ");
System.err.println(" String1 - Name");
System.err.println(" String1 - City");
System.exit(1);
}
}
ExampleTest.java
public class ExampleTest {
@Test
public void testPassingWrongNumberOfInputs() {
StringBuffer sb = new StringBuffer();
sb.append("Usage: String1 String2")
.append("Where: ")
.append(" String1 - Name")
.append(" String1 - City");
String expectedErrorMessage = sb.toString();
ByteArrayOutputStream outContent = new ByteArrayOutputStream();
System.setErr(new PrintStream(outContent));
String[] args = {"one"};
Example.main(args);
assertEquals(expectedErrorMessage, outContent.toString());
}
}
Quel est le but? Une méthode main est plutôt un-unité. L'idée est de 100% converage est plutôt problématique: il a tendance à faire des tests en quelque sorte plus faible parce que les gens de commencer à inventer non-sens, des tests tout simplement pour obtenir 100% de converage.
Votre test est assez drôle (qui ne doit pas être impoli). Il dit: s'il vous plaît tester cette méthode qui va tuer votre environnement en cours d'exécution, puis nous allons le voir, si vous êtes vivant assez pour me dire si ce test était bon ou pas. En d'autres termes: vérifiez que
Le
Le codage de l'équipe de révision en notre compagnie m'a demandé d'ajouter des tests unitaires pour la méthode main.
Votre test est assez drôle (qui ne doit pas être impoli). Il dit: s'il vous plaît tester cette méthode qui va tuer votre environnement en cours d'exécution, puis nous allons le voir, si vous êtes vivant assez pour me dire si ce test était bon ou pas. En d'autres termes: vérifiez que
System.exit(1);
.Le
System.exit()
appel peut être lié au fait que votre code s'arrête...Le codage de l'équipe de révision en notre compagnie m'a demandé d'ajouter des tests unitaires pour la méthode main.
OriginalL'auteur devlperMoose | 2016-01-04
Vous devez vous connecter pour publier un commentaire.
Comment sur les éléments suivants:
Puis dans votre test...
new SecurityException(Integer.toString(status)
puis dans la clause catch vous pouvezassertEquals("1", se.getMessage())
? Peut-être que vous devez déplacer lesetSecurityManager
code d'une méthode de configuration et de créer un démontage de la méthode qui restaure le gestionnaire de sécurité. La même VM peut être utilisé pour les tests multiples. C'est très bien.De bonnes idées. Tous les possibles.
J'ai essayé ton code, mais le test échoue avec l'erreur suivante: org.junit.ComparisonFailure:::<[Utilisation: Mot1 String2Where: Mot1 - Nom Mot1 - Ville]> mais il a été:<[accès: accès autorisé ("java.io.FilePermission" "C:\codebase\jboss\TestProject\bin\com\usaa\example\Example.class" "lu") accès: accès autorisé ("java.io.FilePermission" "C:\codebase\jboss\TestProject\bin\com\usaa\example\Example.class" "lu") Utilisation: Mot1 Mot2 Où: Mot1 - Nom Mot1 - Ville ]>
J'ai compris où suis-je de ceux accès autorisé des messages. Ses parce que j'ai ajouté -Djava.de sécurité.debug=accès,l'échec de la VM args. Je l'ai enlevé, mais toujours obtenir la comparaison échec erro. S'il vous plaît suggérer. org.junit.ComparisonFailure:::<...âge: Mot1 Mot2[ Où: Mot1 - Nom Mot2 - Ville]> mais il a été:<...âge: Mot1 Mot2[ Où: Mot1 - Nom Mot2 - Ville ]>
Vous disposez d'un espace supplémentaire après le second "Ville". Copier une ligne en dessous de l'autre dans un éditeur de texte, et vous pouvez les comparer facilement.
OriginalL'auteur Jose Martinez
J'ai finalement été capable d'écrire le test de l'unité comme illustré ci-dessous. J'ai testé uniquement si la méthode est de frapper Système.exit(1) du code ou pas.
OriginalL'auteur devlperMoose
De supprimer le Système.exit(1) appel, vous n'en avez pas besoin. Votre application va s'arrêter après le main() se termine de toute façon sans inutile de l'appeler explicitement arrêter la machine virtuelle. Cet appel est probablement la cause de votre JUnit à s'arrêter avant d'arriver à votre assertEquals déclaration, parce que tu viens de dire de la VM à arrêter de fumer.
System.exit(1)
, alors vous devriez lui dire aussi comment éviter leArrayIndexOutOfBoundsException
qu'il peut obtenir maintenant.La fixation de la
ArrayOutOfBoundsException
devrait être trivial. Cependant, les utilisateurs ont tendance à utiliser les codes de sortie pour indiquer l'état d'un programme. Si vous ne définissez pas explicitement à 1, il sera 0 - à tort indiquant la réussite.Si oui ou non les "utilisateurs avec pouvoir" retour un code de sortie n'est pas la question. Système D'Appel.exit() provoque la VM à quitter prématurément. Votre code sous test et votre JUnit sont en cours d'exécution sur la même machine virtuelle. si votre code sous test ferme de la VM, puis votre JUnit se ferme aussi. Il n'est jamais une bonne pratique parce que si ce code a été exécuté sur un serveur d'application, alors vous avez juste a votre serveur d'applications vers le bas. Ce n'est jamais une bonne chose dans la production.
Si vous êtes à la recherche d'un mécanisme pour renvoyer un résultat à partir d'une méthode, puis changer votre méthode de signatures pour spécifier un type de retour, et utilisez la touche retour pour retourner une valeur (c'est probablement ce que vous cherchez au Système.exit() est certainement pas le moyen de faire ce que vous cherchez)
J'ai besoin de Système.exit(1), parce que cet Exemple, la classe sera appelée à partir d'un script dans l'environnement de production. Le Script ne comprend pas la langue de "return;".
OriginalL'auteur Kevin Hooke
Renommer la méthode main, et d'ajouter une valeur de retour, de sorte que vous pouvez tester. L'appel de cette nouvelle méthode de main.
OriginalL'auteur GregT