<div class="page"> <div class="cover text-center"> <img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo"> # Tests Car <div class="text-end fit-content ms-auto my-3 mt-auto pt-3"> <p><strong>Autor:</strong> Joan Puigcerver Ibáñez</p> <p><strong>Correu electrònic:</strong> j.puigcerveribanez@edu.gva.es</p> <p><strong>Curs:</strong> 2024/2025</p> </div> <div> <p class="fw-bold mb-0">Llicència: BY-NC-SA</p> <p class="d-none d-md-block">(Reconeixement - No Comercial - Compartir Igual)</p> <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca" target="_blank"> <img class="mx-auto" src="/itb/images/license.png" alt="Licence"/> </a> </div><!--license--> </div><!--cover--> </div><!--page--> {:toc} ## Objectiu Volem comprovar si la classe `Car` es comporta correctament. ```java package ud5.examples; /** * Classe que representa un cotxe. * @author Joan Puigcerver * @version 1.1 2023-01-15 */ public class Car { /** * Matrícula del cotxe */ private final String plate; /** * Velocitat del cotxe en km/h */ private int velocity; /** * Distància total recorreguda pel cotxe en km */ private double kilometers; /** * Constructor d'un Cotxe a partir de la matrícula i els * kilòmetres totals recorreguts. La velocitat inicial és 0 km/h. * @param plate Matrícula del cotxe * @param kilometers Kilòmetres recorreguts */ public Car(String plate, int kilometers){ this.plate = plate; this.kilometers = kilometers; this.velocity = 0; } /** * Constructor d'un Cotxe a partir de la matrícula * Els kilòmetres totals recorreguts inicials és 0 i la velocitat inicial és 0 km/h. * @param plate Matrícula del cotxe */ public Car(String plate){ this(plate, 0); } /** * Obté la matrícula del cotxe * @return Matrícula del cotxe */ public String getPlate() { return plate; } /** * Obté la velocitat actual del cotxe * @return Velocitat del cotxe */ public int getVelocity() { return velocity; } /** * Obté els kilòmetres totals recorreguts pel cotxe * @return Kilòmetres recorreguts */ public double getKilometers() { return kilometers; } /** * Accelera el cotxe en 5 km/h */ public void accelerate(){ accelerate(5); } /** * Accelera el cotxe en la velocitat especificada * @param velocity Velocitat que accelerarà el cotxe */ public void accelerate(int velocity){ this.velocity += velocity; } /** * Condueix el cotxe durant els segons especificats. * Aquest mètode actualitza els kilòmetres recorreguts tenint en compte * la velocitat actual. */ public void drive(int seconds){ this.kilometers += (double) velocity * seconds / 3600; } /** * Condueix el cotxe durant un minut. * Aquest mètode actualitza els kilòmetres recorreguts tenint en compte * la velocitat actual. * @see Car#drive() */ public void drive(){ drive(60); } /** * Retorna una representació de l'objecte en format String * @return Representació del cotxe */ @Override public String toString() { return String.format("Car %s: {velocity=%d km/h, kilometers=%.2f km", plate, velocity, kilometers); } } ``` ## Example Anem a crear la classe `CarTest` i comprovar que els mètodes `accelerate()` i `accelerate(int)` funcionen correctament. Per fer-ho, crearem una instància nova per cada test, utilitzant l'anotació `@BeforeEach`. Després, escriurem tests concrets per cada situació possible: ```java package ud5.examples; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; class CarTest { @Nested @DisplayName("Accelerate tests") class Accelerate { private Car car; @BeforeEach void setup() { car = new Car("0000 BBB"); } @Test @DisplayName("Comprova la velocitat inicial") void testInitialVelocity() { assertEquals(0, car.getVelocity()); } @Test @DisplayName("Accelera una única vegada") void singleAccelerate() { car.accelerate(); assertEquals(5, car.getVelocity()); } @Test @DisplayName("Accelera multiple vegades") void multipleAccelerate() { car.accelerate(); car.accelerate(); car.accelerate(); assertEquals(15, car.getVelocity()); } @Test @DisplayName("Accelera una velocitat determinada") void specificAccelerate() { car.accelerate(13); car.accelerate(14); assertEquals(27, car.getVelocity()); } } } ``` ## Exercicis ### Drive Crea una classe `@Nested` i els tests necesaris per comprovar que els mètodes `drive()` i `drive(int)` funcionen correctament. ### Constructors Crea els tests necesaris per comprovar que els constructors de la classe `Car` funcionen correctament. No crees una classe anidada. ### Decelerate Implementa i documenta els mètodes `decelerate()` i `decelerate(int)`. - `decelerate()`: Redueix la velocitat en 5 km/h. - `decelerate(int)`: Redueix la velocitat en el valor especificat. En qualsevol cas, la velocitat no pot ser negativa. Si s'intenta decelerar més que la velocitat actual, la velocitat final serà 0 km/h. Crea una classe `@Nested` i els tests necessaris per comprovar que el codi funciona correctament.