2010-03-22 5 views
1

Je rencontre des problèmes lors de l'exécution d'un test JUnit.getPackage() renvoie null lorsque mon test JUnit est exécuté à partir de Ant

Cela fonctionne bien dans Eclipse, mais maintenant j'essaie de l'exécuter à partir de la ligne de commande en utilisant Ant. Le problème est que le code suivant renvoie null: getClass().getPackage().

Je cours mon test JUnit comme ceci:

<junit fork="no" printsummary="yes" haltonfailure="no"> 
     <classpath refid="junit.classpath" /> 
     <batchtest fork="yes" todir="${reports.junit}"> 
      <fileset dir="${junit.classdir}"> 
       <include name="**/FileHttpServerTest.class" /> 
       <exclude name="**/*$*" /> 
      </fileset> 
     </batchtest> 
     <formatter type="xml" /> 
     ... 

Je googlé pour ce genre d'erreur, et a trouvé un certain nombre de références à classLoader mauvaise conduite. Mais j'ai trouvé que rien ne me donnait suffisamment d'informations pour résoudre mon problème. J'ai vraiment besoin de getClass().getPackage() pour ne pas retourner de null. Quelqu'un peut-il m'aider?

Merci, Phil

+0

Pourriez-vous poster le code que vous faites l'appel getClass(). GetPackage? –

Répondre

1

Je ne suis pas sûr sur quel objet vous essayez de faire getClass(). GetPackage()? En regardant ce que l'API Javadoc dit pour cette méthode, je suppose que le problème est JUnit est chargé par Bootstrap classloader lorsque vous l'exécutez à partir de la ligne de commande alors que l'objet sur lequel vous faites getPackage() opération est chargé par un des classloaders enfants.

Vous ne savez pas si cela a du sens, mais parce que getPackage essaie de localiser le paquet en utilisant Bootstrap classloader et le comportement du chargeur de classe standard ne regarde pas ses enfants, il renvoie null.

Si vous pouvez donner plus d'idée sur l'objet sur lequel vous faites cette opération, je pourrais être plus précis

+0

Salut Fazal, J'ai d'abord observé le problème dans la classe tierce Jetty 'org.mortbay.jetty.Server' - il appelle getClass(). GetPackage(). GetImplementationVersion() qui provoque une exception NullPointerException. J'ai ensuite ajouté la ligne suivante à ma classe de test lui-même ('FileHttpServerTest'): ' System.out.println (. "Package est" + getClass() getPackage()); ' Cette impression « paquet est nul". –

1

Essayez d'exécuter vos tests avec junit fork="yes", qui isolera votre classloading assez raisonnable et peut résoudre votre problème.

+0

Merci Yishai, j'ai essayé cela et cela n'a fait aucune différence –

+0

@philharvey, ce qui n'a pas fait de différence, votre propre classe FileHttpServerTest ou la classe Jetty, ou les deux? – Yishai

+0

Malheureusement, cela n'a pas changé le résultat de l'appel de getObject(). GetPackage() dans les deux classes –

1

Si c'est une faute de classloader, vous pouvez toujours charger la même classe en utilisant différents classloader:

URLClassLoader cld = new URLClassLoader(new URL[] { urlsToClasses }); 
Class.forName(getClass().getName(), true, cld).getPackage(); 

Le problème ici est de savoir, comment trouver chemin de classe urls (urlsToClasses). Je ne suis pas familier avec les chargeurs de classe JUnit, vous pouvez donc essayer de convertir Thread.currentThread().getContextClassLoader() en URLClassLoader pour voir si cela peut vous aider à obtenir ces URL.

Questions connexes