2010-08-16 4 views
6

J'ai écrit un exemple de maquette pour illustrer cela sans exposer quoi que ce soit de confidentiel. C'est un exemple "fictif" qui ne fait rien, mais le problème se produit dans l'initialiseur de test.Comment utiliser un coureur JUnit Parameterized avec un constructeur varargs?

@RunWith(Parameterized.class) 
public class ExampleParamTest 
{ 
int ordinal; 
List<String> strings; 

public ExampleParamTest(int ordinal, String... strings) 
{ 
    this.ordinal = ordinal; 
    if (strings.length == 0) 
    { 
    this.strings = null; 
    } 
    else 
    { 
    this.strings = Arrays.asList(strings); 
    } 
} 

@Parameters 
public static Collection<Object[]> data() { 
    return Arrays.asList(new Object[][] { 
    {0, "hello", "goodbye"}, 
    {1, "farewell"} 
    }); 
} 

@Test 
public void doTest() { 
    Assert.assertTrue(true); 
} 
} 

Fondamentalement, j'avoir un constructeur de test qui accepte plusieurs arguments pour une variable de liste locale et je veux remplir ce par un initialiseur de tableau. La méthode de test gère correctement la variable de la liste locale - j'ai supprimé cette logique pour simplifier le test. Quand j'écris ceci, mon EDI ne se plaint pas de la syntaxe et de la construction de la classe de test sans aucune erreur de compilation. Cependant quand je le lance, je reçois:

doTest[0]: 
java.lang.IllegalArgumentException: wrong number of arguments 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
doTest[1]: 
java.lang.IllegalArgumentException: argument type mismatch 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 

exactement ce qui a mal tourné ici, et comment puis-je utiliser correctement ce modèle?

+0

Qu'est-ce que doTest et quelles données contient-il? – Jes

+0

Dans cet exemple, doTest est juste un test fictif pour permettre à cette suite de tests de s'exécuter dans JUnit. Le problème ne se trouve pas dans le code de test, comme vous le verrez lorsque vous essayez d'exécuter ce test en l'état; malgré le fait qu'il ait un corps de test presque vide, il ne fonctionne toujours pas en raison de l'erreur d'initialisation mentionnée ci-dessus. – Kidburla

+0

J'ai ajouté une partie de la piletrace que je vois quand j'exécute votre test pour indiquer clairement que l'erreur se produit lorsque le constructeur varargs est appelé. Si c'est différent de ce que vous voyez, n'hésitez pas à le changer ou à le rétablir. –

Répondre

11

Impossible de le tester maintenant mais je suppose que si vous appelez une méthode ou un constructeur avec des arguments variables, vous devez l'appeler avec un tableau au lieu d'une liste de valeurs variable.

Si je ne me trompe pas, cela devrait fonctionner:

@Parameters 
public static Collection<Object[]> data() { 
    return Arrays.asList(new Object[][] { 
    {0, new String[]{"hello", "goodbye"}}, 
    {1, new String[]{"farewell"}} 
    }); 
} 

Quelques explications

Au niveau du code source, nous pouvons écrire

test = ExampleParamTest(0, "one", "two"); 

Le compilateur convertira cette à un tableau de chaînes. JUnit utilise la réflexion et l'API invocation, et dans cette perspective, la signature des constructeurs est

public ExampleParamTest(int i, String[] strings); 

Donc, pour invoquer le constructeur - et c'est ce que JUnit fait en interne - vous devez passer un entier et un tableau de chaînes.

+0

Je l'ai essayé, ça marche. –

+0

Vous avez raison, cela a fonctionné. Mais ce n'est pas universellement vrai. Normalement, je pourrais écrire quelque chose comme: myTest = new ExempleParamTest (0, "bonjour", "au revoir"); C'est le point entier des méthodes d'argument variable. Pourquoi alors cela ne fonctionne-t-il pas dans mon exemple? – Kidburla

Questions connexes