Je suis novice en tests unitaires et cela fait plus de 10 jours que je cherche à tester les entrées et les sorties de véhicules dans un parking pour générer un ticket (gratuit si moins de 30 minutes), mon test échoue dans tous les coups..
J'ai soupçonné la concordance (comparaison des millisecondes mais je crois que je compare la même valeur ?
Merci d'avance
// Classe qui compare les valeurs pour générer un ticket
package com.parkit.parkingsystem.service;
import com.parkit.parkingsystem.constants.DBConstants;
import com.parkit.parkingsystem.constants.Fare;
import com.parkit.parkingsystem.dao.TicketDAO;
import com.parkit.parkingsystem.model.Ticket;
public class FareCalculatorService {
private DBConstants dbConstants;
public static final int THIRTY_MINUTES = 1800000; // 30 * 60 * 1000
public static final int HOUR = 1440000; // 24 * 60 * 1000
public static final int TWINTY_FOUR_HOURE = 1440000; // 24 * 60 * 60 * 1000
private TicketDAO ticketDAO;
public void calculateFare(Ticket ticket) {
if ((ticket.getOutTime() == null) || (ticket.getOutTime().before(ticket.getInTime()))) {
throw new IllegalArgumentException("Out time provided is incorrect:" + ticket.getOutTime().toString());
}
int inHour = ticket.getInTime().getHours();
int outHour = ticket.getOutTime().getHours();
// TODO: Some tests are failing here. Need to check if this logic is
// correct
int duration = outHour - inHour;
String resultSet = DBConstants.RESULT_SET;
if (resultSet != null) {
switch (ticket.getParkingSpot().getParkingType()) {
case CAR: {
ticket.setPrice(100 / (5 * Fare.CAR_RATE_PER_HOUR));
break;
}
case BIKE: {
ticket.setPrice(100 / (5 * Fare.BIKE_RATE_PER_HOUR));
break;
}
default:
throw new IllegalArgumentException("Unkown Parking Type");
}
}
if (duration < HOUR) {
switch (ticket.getParkingSpot().getParkingType()) {
case CAR: {
ticket.setPrice(0.75 * Fare.CAR_RATE_PER_HOUR);
break;
}
case BIKE: {
ticket.setPrice(0.75 * Fare.BIKE_RATE_PER_HOUR);
break;
}
default:
throw new IllegalArgumentException("Unkown Parking Type");
}
}
if (duration < THIRTY_MINUTES) {
} else if (duration < 30) {
switch (ticket.getParkingSpot().getParkingType()) {
case CAR: {
ticket.setPrice(0);
break;
}
case BIKE: {
ticket.setPrice(0);
break;
}
default:
throw new IllegalArgumentException("Unkown Parking Type");
}
}
else {
switch (ticket.getParkingSpot().getParkingType()) {
case CAR: {
ticket.setPrice(duration * Fare.CAR_RATE_PER_HOUR);
break;
}
case BIKE: {
ticket.setPrice(duration * Fare.BIKE_RATE_PER_HOUR);
break;
}
default:
throw new IllegalArgumentException("Unkown Parking Type");
}
}
}
}
Classe des tests
//Classe de test
package com.parkit.parkingsystem;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.Date;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.parkit.parkingsystem.constants.Fare;
import com.parkit.parkingsystem.constants.ParkingType;
import com.parkit.parkingsystem.model.ParkingSpot;
import com.parkit.parkingsystem.model.Ticket;
import com.parkit.parkingsystem.service.FareCalculatorService;
public class FareCalculatorServiceTest {
private static FareCalculatorService fareCalculatorService;
private Ticket ticket;
@BeforeAll
private static void setUp() {
fareCalculatorService = new FareCalculatorService();
}
@BeforeEach
private void setUpPerTest() {
ticket = new Ticket();
}
@Test
public void calculateFareBikeWithLessThanThirtyMinutesFreeParkingTime() {
Date inTime = new Date();
inTime.setTime(System.currentTimeMillis() - (30 * 60 * 1000));// 30
// minutes
// parking
// time
// should
// give
// free
Date outTime = new Date();
ParkingSpot parkingSpot = new ParkingSpot(1, ParkingType.BIKE, false);
ticket.setInTime(inTime);
ticket.setOutTime(outTime);
ticket.setParkingSpot(parkingSpot);
fareCalculatorService.calculateFare(ticket);
assertEquals((0), ticket.getPrice());
}
}
Premier point qui m'interpelle, ce sont les valeurs de tes constantes
1. THIRTY_MINUTES > HOUR
2. HOUR = TWINTY_FOUR_HOURE
Deuxièmement, tu ne récupères que l'heure d'entrée / sortie (au lieu du time: ticket.getInTime().getTime()), donc tu n'obtiendras jamais 30mn, et tes tests avec les constantes en secondes échoueront systématiquement.
Donc ton test échoue car tu n'utilises pas les mêmes unités (la fameuses phrase des profs : on ne mélange pas les choux et les carottes ;-) )
Sinon, pourquoi ne pas utiliser les Date introduites en Java 8 qui permettent des manipulations plus simples (LocalDateTime) ?
Merci JDesm pour ton message, désolé pour le retard de ma réponse,
j'ai dû finalisé les cours : "Testez votre code Java pour réaliser des applications de qualité" et "Débuggez votre application Java"
Pour mieux comprendre les comportements et les valeurs de mes méthodes... J'ai apporté quelques ajustements sur la classe mais sans pouvoir réussir les tests..
J'ai expérimenté également LocalDateTime, alors à ce moment-là faut-il changer le type des attributs dans la classe "tickets" ?
package com.parkit.parkingsystem.service;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.parkit.parkingsystem.config.DataBaseConfig;
import com.parkit.parkingsystem.constants.DBConstants;
import com.parkit.parkingsystem.constants.Fare;
import com.parkit.parkingsystem.dao.TicketDAO;
import com.parkit.parkingsystem.model.Ticket;
public class FareCalculatorService {
private DBConstants dbConstants;
private static final Logger logger = LogManager.getLogger("FareCalculator");
public DataBaseConfig dataBaseConfig = new DataBaseConfig();
private TicketDAO ticketDAO;
// Si le véhicule a déja été dans le parking au moins une fois pour
// appliquer la remise 5%
public String recurring_park() {
Connection con = null;
String ResultSet;
try {
con = dataBaseConfig.getConnection();
PreparedStatement ps = con.prepareStatement(DBConstants.RESULT_SET);
ResultSet rs = ps.executeQuery();
} catch (Exception ex) {
logger.error("Error fetching next next value", ex);
} finally {
dataBaseConfig.closeConnection(con);
return "0";
}
}
public void calculateFare(Ticket ticket) {
if ((ticket.getOutTime() == null) || (ticket.getOutTime().before(ticket.getInTime()))) {
throw new IllegalArgumentException("Out time provided is incorrect:" + ticket.getOutTime().toString());
}
int inHour = ticket.getInTime().getHours();
int outHour = ticket.getOutTime().getHours();
int inMinutes = ticket.getInTime().getMinutes();
int outMinutes = ticket.getOutTime().getMinutes();
int inDay = ticket.getInTime().getDay();
int outDay = ticket.getOutTime().getDay();
int duration_hour = outHour - inHour;
int duration_in_Minutes = inMinutes - outMinutes;
int duration_in_Days = inDay - outDay;
// String resultSet = DBConstants.RESULT_SET;
double price_car_promo = 100 / (Fare.CAR_RATE_PER_HOUR * 5);
double price_bike_promo = 100 / (Fare.CAR_RATE_PER_HOUR * 5);
double add_promo_car_if_exist = 0;
double add_promo_bike_if_exist = 0;
/*
* Constances class 'dbConstants'
*
* 30 * 60 * 1000
* public static final int THIRTY_MINUTES = 1800000;
*
* 24 * 60 * 60 * 1000
* public static final int HOUR = 3600000;
* 24 * 60 * 60 * 1000
* public static final int DAY = 86400000;
*/
if (duration_in_Minutes <= dbConstants.THIRTY_MINUTES) {
// Tester si le véhicule est déjà passé dans le parking et appliquer
// la promo 5%
switch (ticket.getParkingSpot().getParkingType()) {
case CAR: {
logger.info("Info log message");
ticket.setPrice(0);
break;
}
case BIKE: {
ticket.setPrice(0);
break;
}
default:
throw new IllegalArgumentException("Unkown Parking Type");
}
} else if (duration_hour <= dbConstants.HOUR && duration_in_Minutes >= dbConstants.THIRTY_MINUTES) {
System.out.println("hour");
switch (ticket.getParkingSpot().getParkingType()) {
case CAR: {
ticket.setPrice(Fare.CAR_RATE_PER_HOUR - add_promo_car_if_exist);
break;
}
case BIKE: {
ticket.setPrice(Fare.BIKE_RATE_PER_HOUR - add_promo_bike_if_exist);
break;
}
default:
break;
}
} else {
if (duration_in_Days >= dbConstants.DAY) {
// Day
switch (ticket.getParkingSpot().getParkingType()) {
case CAR: {
ticket.setPrice((duration_in_Days * (24 * Fare.CAR_RATE_PER_HOUR)) - add_promo_car_if_exist);
break;
}
case BIKE: {
ticket.setPrice((duration_in_Days * (24 * Fare.BIKE_RATE_PER_HOUR)) - add_promo_car_if_exist);
break;
}
default:
break;
}
}
}
}
}
Nobody is perfect I'm Nobody...
Tests Unitaires pour gérer le temps échouent
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Nobody is perfect I'm Nobody...
Nobody is perfect I'm Nobody...