2014-05-22 6 views
4

Je suis en train de lancer mon test Junit par une tâche Ant, comme ci-dessous:JUnit Eclipse VS Ant

<target name="TestDaoImpl"> 
     <mkdir dir="${junit.output.dir}"/> 
     <junit fork="yes" printsummary="withOutAndErr"> 
      <jvmarg line="${conf.dir}"/> 
      <formatter type="xml"/> 
      <test name="my.package.TestKSLDaoImpl" todir="${junit.output.dir}"/> 
      <classpath refid="My.classpath"/> 
     </junit> 
</target> 

Dans mon test, je me sers PowerMockito, pour ces deux cas:

PowerMockito.whenNew(Convert.class).withAnyArguments().thenReturn(convert); 
PowerMockito.mockStatic(MyService.class); 

Et Mockito:

Mockito.when(convert.getXmlKsl(folder)).thenReturn(xmlStr); 

En fait, lorsque j'ai exécuté mon test dans Eclipse, je n'ai pas eu d'erreurs. Mais quand je lance par tâche Ant, j'ai eu cette erreur:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
    Those methods *cannot* be stubbed/verified. 
2. inside when() you don't call method on mock but on some other object. 
3. the parent of the mocked class is not public. 
    It is a limitation of the mock engine. 

at org.powermock.api.mockito.PowerMockito.when(PowerMockito.java:495) 

L'erreur est ici:

PowerMockito.mockStatic(MyService.class); 

===> Mockito.when(MyService.getInstance(myId)).thenReturn(myService); 

J'utilise ce jarres:

JUnit 4 
cglib-nodep-2.2.2.jar 
javassist-3.18.1-GA.jar 
mockito-all-1.9.5.jar 
objenesis-2.1.jar 
powermock-mockito-1.5.4-full.jar 

Y at-il conflit avec fourmi et PowerMockito? Pourquoi le test fonctionne bien avec Eclipse mais pas avec Ant?

+1

La cause type de ces types de problèmes (la construction fonctionne sur la ligne de commande ou l'EDI, mais pas sur l'autre) est liée aux différences dans le chemin de classe. En règle générale, les outils de ligne de commande et les IDE résolvent les dépendances différemment. –

+0

Quelle version de JUnit utilisez-vous? –

+0

Juste un sidenote: mockito en espagnol signifie "petite morve". C'est tout –

Répondre

2

Pourquoi les tests pourraient passer dans Eclipse mais ne parviennent pas lorsqu'il est exécuté sur la ligne de commande:

La cause de ces types de problèmes, une construction qui passe soit sur la ligne de commande ou de l'IDE, mais pas sur les deux, est typiquement lié aux différences dans le classpath. Généralement, les outils de ligne de commande et les IDE résolvent les dépendances différemment. De plus, la plupart des IDE ont aussi leur propre version de JUnit qui pourrait ne pas correspondre à ce qui est spécifié par le projet. Pour résoudre ce problème, vous devrez analyser les différences dans les classes utilisées par l'outil de ligne de commande, dans ce cas Ant, et votre IDE. Gardez à l'esprit que l'ordre dans lequel les dépendances apparaissent sur la ligne de commande est important lorsqu'une classe est incluse dans plusieurs dépendances. La désignation "tous" signifie que toutes les classes dépendantes sont préemballées dans le jar, cela peut poser des problèmes si vous incluez une version plus récente des dépendances, puis ce qui est pré-emballé. Par exemple, si vous avez des dépendances sur Mockito-All 1.9.5, qui a pré-emballé Hamcrest 1.1, et Hamcrest 1.3, vous aurez deux copies différentes du même jar sur le classpath. Ce n'est pas toujours un problème sauf si vous essayez d'utiliser une méthode qui est dans une version mais pas l'autre. Habituellement, quelle version est listée en premier est utilisée.

Il existe des problèmes de dépendance connus avec certaines versions de JUnit 4, Mockito-all 1.9.5 et Hamcrest. Je recommande de spécifier: JUnit 4.11, Mockito-core 1.9.5 et Hamcrest 1.3. Vous voudrez vérifier pour vous assurer qu'Eclipse utilise ces versions et ne pas substituer ses propres versions.

conflits entre Ant et PowerMockito:

Ant est un outil de construction et ne devrait pas avoir de conflit avec PowerMock. Cela peut vous valoir du temps et des efforts pour passer à un outil de construction plus moderne avec une meilleure gestion des dépendances. Les deux Maven et Gradle sont bien soutenus.