2009-12-03 11 views
0

(Ceci est une question de suivi à un this.)tests JUnit exécuter des erreurs Eclipse de retour même si je annotation attendue

Je vais avoir un problème avec les tests de junit4 dans Eclipse. J'essaie d'utiliser l'annotation @Test (expected = ...) pour le lancement d'exception de test unitaire. Le problème est que lorsque j'exécute les tests, ils reviennent comme des erreurs au lieu de passer, même si je m'attends à ce que les exceptions soient levées. J'utilise eclipse 3.4.0 et Junit 4.3.1.

Voici le code:

classe à tester:

public class IPAddress 
{ 
    private byte[] octets; 

    private IPAddress() 
    { 
     octets = new byte[4]; 
    } 

    public IPAddress(String addr) throws InvalidIPAddressException 
    { 
     this(); 

     if(addr == null || !isValid(addr)) 
      throw new InvalidIPAddressException(addr); 

     String strOctets[] = addr.split("\\."); 

     for (int i = 0; i < strOctets.length; i++) 
      octets[i] = Byte.parseByte(strOctets[i]); 
    } 

    public static boolean isValid(String addr) 
    { 
     String strOctets[] = addr.split("\\."); 

     if (strOctets.length != 4) 
      return false; 

     for (int i = 0; i < strOctets.length; i++) 
     { 
      try 
      { 
       int num = Integer.parseInt(strOctets[i]); 

       if (num < 0 || num > 255) 
        return false; 
      } catch (NumberFormatException e) 
      { 
       return false; 
      } 
     } 

     return true; 
    } 

    public byte[] getOctets() 
    { 
     return octets; 
    } 
} 

Exception:

public class InvalidIPAddressException extends Exception 
{ 
    public InvalidIPAddressException(String addr) 
    { 
     super("\"" + addr + "\" is not a valid IP address"); 
    } 
} 

cas de test:

public class IPAddressTest extends TestCase 
{ 
    @Test(expected=InvalidIPAddressException.class) 
    public void testNullParameter() throws InvalidIPAddressException 
    { 
     @SuppressWarnings("unused") 
     IPAddress addr = new IPAddress(null); 
     fail("InvalidIPAddressException not thrown."); 
    } 

    @Test(expected=InvalidIPAddressException.class) 
    public void testHostnameParameter() throws InvalidIPAddressException 
    { 
     @SuppressWarnings("unused") 
     IPAddress addr = new IPAddress("http://www.google.com"); 
     fail("InvalidIPAddressException not thrown."); 
    } 

    @Test 
    public void testValidIPAddress() throws InvalidIPAddressException 
    { 
     IPAddress addr = new IPAddress("127.0.0.1"); 
     byte[] octets = addr.getOctets(); 

     assertTrue(octets[0] == 127); 
     assertTrue(octets[1] == 0); 
     assertTrue(octets[2] == 0); 
     assertTrue(octets[3] == 1); 
    } 

    public static void main(String[] args) 
    { 
     TestRunner.run(IPAddressTest.class); 
    } 
} 

Répondre

4

Il semble que vous mélangez du code JUnit 3 et 4. TestRunner fait partie de JUnit 3, donc ne regarde pas du tout les annotations. Essayez de supprimer extends TestCase et de remplacer TestRunner.run(IPAddressTest.class); par JUnitCore.runClasses(IPAddressTest.class); (vous devrez ajouter les importations si nécessaire).

+0

Cela l'a corrigé. Merci! – Seth

+0

En outre, si vous utilisez eclipse, vous pouvez utiliser le testeur intégré - faites un clic droit sur la classe de test dans l'explorateur de paquets et choisissez Exécuter en tant que - test JUnit. La méthode JUnitCore.runClasses ne donne aucune sortie, ce qui peut être un meilleur moyen. – matt

0

probablement parce que lorsque vous essayez d'instancier la InvalidIPAddre ssException le constructeur lance une exception NullPointerException lorsqu'il tente de concaténer la chaîne.

public InvalidIPAddressException(String addr) 
{ 
    super("\"" + addr + "\" is not a valid IP address"); // NPE while concatenate 
}