<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.
Aquest lloc web utilitza galetes per millorar l'experiència de l'usuari