2017-06-17 3 views
-1

Je voudrais tester une méthode qui peut prendre des données à partir d'une adresse URL spécifique et l'ajouter en tant que chaîne à ArrayList. Le code pour l'instant:Test du lecteur en mémoire tampon

public List<String> getListOfAirportsFromCsvAsAStrings(String urlAddress) { 

    BufferedReader reader = null; 

    try { 
     URL url = new URL(urlAddress); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

     connection.setRequestMethod("GET"); 

     reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

     String line = null; 
     while ((line = reader.readLine()) != null) { 
      airportsAsAStringFromCsvFile.add(line); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
     } 
    } 
    return airportsAsAStringFromCsvFile; 
} 

Cette méthode est testable?

+0

Bonnes réponses, mais la question elle-même est trop large .. – GhostCat

Répondre

1

Ceci est le mauvais code qui ne peut pas être testé unitairement, les tests unitaires consistent à tester un peu de code "unit" habituellement en classe, si ce code a besoin d'autres classes pour fonctionner, vous devez utiliser des classes fictives et pas d'implémentation réelle.

Dans votre cas, vous devez découpler le code qui va au réseau du code lu dans le flux.

public class Parser { 

    public List<String> getListOfAirportsFromCsvAsAStrings(InputStream inputCsvData) { 
     List<String> airportsAsAStringFromCsvFile = new ArrayList<>(); 
     try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputCsvData))) { 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       airportsAsAStringFromCsvFile.add(line); 
      } 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
     return airportsAsAStringFromCsvFile; 
    } 
} 

Je simplifie votre code (besoin de Java 7 ou mieux). Et c'est classe de test pour votre analyseur:

import example.Parser; 
import org.junit.Assert; 
import org.junit.Test; 

import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.util.Arrays; 
import java.util.List; 

    public class ParserTest { 

     @Test 
     public void shouldReturnParsedTextFromInputFileStream() throws Exception { 
      String text = "row1\nrow2\nrow3"; 
      InputStream inputFileStream = new ByteArrayInputStream(text.getBytes()); 
      Parser parser = new Parser(); 
      List<String> result = parser.getListOfAirportsFromCsvAsAStrings(inputFileStream); 
      List<String> expected = Arrays.asList("row1", "row2", "row3"); 
      Assert.assertEquals(expected, result); 
     } 
    } 

Supposons que vous avez bibliothèque JUnit dans votre classpath. P.S. À mon avis, ce code sent toujours et vous avez besoin de refactoriser votre code.

1

En l'état, la méthode est une douleur à tester. Ce n'est clairement pas fait de manière TDD, comme le dit l'étiquette.

Ne créez pas une connexion HttpURLConnection dans le code testé. Laissez l'appelant passer une. De cette façon, vous pouvez vous moquer facilement dans les tests et passer quelque chose qui ressemble à une connexion réseau, mais ce n'est pas la réalité. Gardez les dépendances externes comme le réseau hors des tests unitaires. Dans le code de production, vous pouvez facilement ajouter un pool de connexions ou d'autres détails de connexion si les connexions sont créées au même endroit.

Ne pas avaler des exceptions. Toute erreur passera inaperçue. Des heures de débogage amusant à venir. Vous ne pouvez même pas tester le comportement d'erreur.

Est-ce que airportsAsAStringFromCsvFile est une variable membre? Ce devrait probablement être une variable locale, et vous pourriez rendre votre fonction statique.

Vous pouvez également utiliser try with resources.

En ce qui concerne les livres TDD, vous pouvez essayer:

+0

Ok merci, connaissez-vous un bon tutoriel pour les tests TDD? J'ai vu quelques livres, tutoriels mais les exemples sont très simples pas du code réel ... c'est difficile pour moi de changer de pensée pour les tests TDD – przemekost

+0

@przemekost essayez celui-ci https://www.amazon.com/Practical-Unit-Testing- JUnit-Mockito/dp/8393489393 – fxrbfg

+0

@przemekost Mis à jour ma réponse – Robert