2010-06-27 5 views
4

Je possède ce ParkingLot.javaAccéder à une liste en cas de test JUnit

public class ParkingLot { 

private final int size; 
private Car[] slots = null; 

List<String> list = new ArrayList<String>(); 

public ParkingLot(int size) { 
    this.size = size; 
    this.slots = new Car[size]; 
} 

public List licenseWithAParticularColour(String colour) { 
    for (int i = 0; i < slots.length; i++) { 
     if (slots[i].getColour() == colour) { 
      System.out.println(slots[i].getLicense()); 
      list.add(slots[i].getLicense()); 
      return list; 
     } 
    } 
    return null; 
} 

}

J'ai créé un ParkingLotTest.java comme suit

public class ParkingLotTest { 

private Car car1; 
private Car car2; 
private Car car3; 

private Ticket ticket1; 
private Ticket ticket2; 
private Ticket ticket3; 

private ParkingLot parkingLot; 

private List<String> list = new ArrayList<String>(); 

@Before 
public void intializeTestEnvironment() throws Exception { 
    this.car1 = new Car("1234", "White"); 
    this.car2 = new Car("4567", "Black"); 
    this.car3 = new Car("0000", "Red"); 

    this.parkingLot = new ParkingLot(2); 

    this.ticket1 = parkingLot.park(car1); 
    this.ticket2 = parkingLot.park(car2); 
    this.ticket3 = parkingLot.park(car3); 
    this.list = parkingLot.list; 


} 

@Test 
public void shouldGetLicensesWithAParticularColour() throws Exception { 
    assertEquals(, parkingLot.licenseWithAParticularColour("White")); 

} 

}

Dans le cas de test ci-dessus, je veux vérifier que la liste est remplie avec les licences correctes. 1. Comment puis-je créer un champ dans ParkingLotTest.java afin que la liste dans la première classe soit la même que la liste dans le fichier de deuxième classe.

Répondre

5

D'abord, je ne pense pas que vous avez besoin d'une list sur ParkingLot si votre question ne fait pas vraiment beaucoup de sens :)

En second lieu, vient de mettre en place le résultat attendu dans chaque méthode d'essai:

public class ParkingLotTest { 

    //... 

    @Test 
    public void shouldGetLicensesWithAParticularColour() throws Exception { 
     List<Car> expected = new ArrayList<Car>(); 
     expected.add(...); 

     assertEquals(expected, parkingLot.licenseWithAParticularColour("White")); 
    } 

} 

Et n'oubliez pas de tester également des valeurs inattendues ou des cas spéciaux. Par exemple:

@Test 
public void shouldNotGetLicensesWithANullColour() throws Exception { 
    ... 
    assertEquals(expected, parkingLot.licenseWithAParticularColour(null)); 
} 

@Test 
public void shouldNotGetLicensesWithAnUnknownColour() throws Exception { 
    ... 
    assertEquals(expected, parkingLot.licenseWithAParticularColour("unknown")); 
} 

Quelques remarques supplémentaires:

  • je ne voudrais pas utiliser un Car[] pour le slots mais List<Car>.
  • Vous n'avez pas vraiment besoin de List<String> list dans ParkingLot (et l'implémentation actuelle de licenseWithAParticularColour est boguée). Je voudrais utiliser un Enum pour la couleur.
+0

oui, cela a très bien fonctionné. merci;) Je comprends le 1er test, mais comment ma fonction peut-elle retourner "unknown"? – theTuxRacer

+0

@thetuxracer: Ce que je voulais dire était de vérifier le comportement lors du passage d'une couleur "inconnue" (c'est-à-dire en tant que paramètre, pas en tant que valeur de retour). –

+2

+1 pour les tests hors cas. Pour le cas null, je dirais que lancer une exception 'NullPointerException' est une alternative raisonnable au renvoi d'une liste vide, donc tirer parti de' @Test (expected = ...) 'est une autre façon de procéder. – Carl

2

Cependant, vous voulez?

C'est un peu drôle, mais vous construisez normalement un List qui ira très bien - tant qu'il est compatible avec ce que vous voulez que votre liste d'interface testée soit.

Dans ce cas particulier, je recommanderais de construire un List<Car> comme référence de test, puis de visiter chaque Car et de le garer. Vous pouvez ensuite créer la liste des licences à partir de cette liste de référence et la comparer à celle du parking. Assurez-vous simplement que votre direction d'itération est correcte. D'après ce que je vois, je ne pense pas que les choses fonctionnent comme elles sont censées fonctionner - c'est une bonne chose que vous le testiez.

1

La réponse de Pascal a fonctionné pour moi.

@Pascal Encore une fois, je fait cette fonction:

public List getSlotNumbersWithAParticularColour(String colour) { 
     List<Integer> listOfTicketsWithAColour = new ArrayList<Integer>(); 
     for (int i = 0; i < slots.length;) { 
      if (slots[i].getColour() == colour) { 
       listOfTicketsWithAColour.add(i); 

      } 
      return listOfTicketsWithAColour; 

     } 
     return null; 
    } 

La faute n'est pas dans la boucle, l'ajout d'un i ++ est "mort-code" selon Eclipse. L'ajout du i ++ ne cause aucune différence.

et le test cas correspondant:

public void getSlotNumbersWithAGivenColour() throws Exception { 
     List<String> expected = new ArrayList<String>(); 
     expected.add("0"); 
     expected.add("3"); 

     assertEquals(expected, parkingLot.getSlotNumbersWithAParticularColour("White")); 
    } 

Le test échoue. La fonction renvoie seulement 0, au lieu de 0,3. Une idée pourquoi?

+0

nver-mind, c'était marrant de moi. J'ai fait une liste de chaînes, en comparant avec la liste des entiers. – theTuxRacer

+1

Si la réponse de Pascal a fonctionné, alors vous devriez l'accepter. – Carl

Questions connexes