【发布时间】:2022-06-26 09:45:57
【问题描述】:
我非常难于解决一个由正在测试的 java 包组成的练习,其中一些测试我发现无法通过。
包中有两个类别,即汽车和停车。它们之间的关系是一种聚合——Parking 是复合,Car 是组件:
Parking -parking (0...1)------- -cars(*) 汽车
-parking 和 -cars 是分别与类 Parking 和 Car 相关的属性。 -parking 属性可以有两个值,0 或 1,-cars 是一个未定义维度的数组。
一辆车可以分配到一个或没有一个停车位。同样,停车场是由数量不定的停车场组成的。
代码如下:
package package;
public class Parking {
private String name; // Parking's name
private String address; // Parking's address
private int capacity; // Parking's capacity (number of cars can be parked in)
private Car[] cars; // Array of cars that can be parked
public Parking() { // Default constructor
name = "Default parking";
address = "59th Street";
capacity = 10;
cars = new Car[capacity];
}
public Car[] getCars() { // Getter of the array 'cars'
return cars;
}
public int getFirstFreeParkingLot() { // Returns first free empty slot of the
// array 'cars'. A car can be parked there.
// Otherwise, returns -1
int i;
boolean b = false;
for (i = 0; i < cars.length; i++) {
if (cars[i] == null) {
b = true;
break;
}
}
if (!b) return -1;
else return i;
}
public void addCar (Car car) throws Exception { // Adds a car to a parking lot
if (car == null) throw new Exception("[ERROR] The car cannot be null");
else if (getParkingLotNumberByCar(car) != -1) throw new Exception("[ERROR] This car is already in this parking");
else if (isFull()) throw new Exception("[ERROR] This parking is full");
else if (getFirstFreeParkingLot() != -1) {
cars[getFirstFreeParkingLot()] = car;
car.setParking(car.getParking());
}
}
public void removeCar (Car car) throws Exception { // remove a car from a parking
// lot
if(getParkingLotNumberByCar(car) != -1) {
cars[getParkingLotNumberByCar(car)] = null;
car.setParking(null);
}
else throw new Exception("[ERROR] This car does not exist in this parking");
}
public boolean isFull() { // Checks if the parking is full.
int i;
boolean b = false;
for (i = 0; i < cars.length; i++) {
if (cars[i] == null) {
b = true;
break;
}
}
return !b;
}
public boolean isFree() { // Checks if there's at least one empty parking lot
int i;
boolean b = false;
for (i = 0; i < cars.length; i++) {
if (cars[i] == null) {
b = true;
break;
}
}
return b;
}
public boolean isEmpty() { // Checks if the entire parking lot is empty
int i;
boolean b = false;
for (i = 0; i < cars.length; i++) {
if (cars[i] != null) {
b = true;
break;
}
}
return !b;
}
public int getParkingLotNumberByCar (Car car) { // Return the index of the array
// 'cars' where the car given as
// argument is present in the
// parking lot. Otherwise, returns -1
int i;
boolean b = false;
for (i = 0; i < cars.length; i++) {
if (cars[i] == car) {
b = true;
break;
}
}
if (!b) return -1;
else return i;
}
public int getNumFreeParkingLots() { // Return the number of free parking lots in a parking
int i;
int n = 0;
for (i = 0; i < cars.length; i++) {
if (cars[i] == null) n++;
}
return n;
}
}
package package;
import javax.management.ObjectName;
import java.time.LocalDate;
import java.util.Objects;
import java.util.UUID;
public class Car {
private Parking parking;
public Car() {
parking = null;
}
public Parking getParking() {
return parking;
}
public void setParking(Parking parking) throws Exception {
if (parking == null)
this.parking = null;
else {
parking.addCar(parking.getCars()[parking.getParkingLotNumberByCar(new Car())]);
if (this.parking != parking) this.parking.removeCar(parking.getCars()[parking.getParkingLotNumberByCar(new Car())]);
}
}
}
下面是一个我没有通过的测试:
package package;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import static org.junit.jupiter.api.Assertions.*;
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(OrderAnnotation.class)
class IntegrationTest {
Parking parking1;
Car car1;
@BeforeAll
void init(){
try {
parking1 = new Parking();
car1 = new Car();
} catch (Exception e) {
e.printStackTrace();
fail("Init failed");
}
}
@Test
@Order(1)
void testIntegration1() {
try {
parking1.addCar(car1);
assertEquals(0, parking1.getParkingLotNumberByCar(car1));
assertEquals(9, parking1.getNumFreeParkingLots());
assertEquals(1, parking1.getFirstFreeParkingLot());
assertEquals(car1, parking1.getCars()[parking1.getParkingLotNumberByCar(car1)]);
assertEquals(parking1, car1.getParking());
} catch (Exception e) {
e.printStackTrace();
fail("Integration1 failed");
}
}
使用 Car 类中的 setParking (Parking 停车) 方法和 Parking 类中的 addCar (Car car) 和 removeCar (Car car) 方法时,关键部分就出现了。 Car 类中的 setParking 方法建立了属性 parking 并调用了 Parking 类的 addCar 和 remove Car 方法,依次添加和移除停车场中的汽车,最后调用上面提到的 setParking 方法。
我可以将汽车添加到停车场,但我未能将停车场信息添加到该汽车。
要引用 Car 类中的 Car 对象,我使用“new Car”,而当涉及到 Parking 类时,我使用“new Parking”。我的操作正确吗?
我失败的所有测试都与上述这些方法的不成功交织有关 -parking.addCar、parking.removeCar、car.setParking。
有人可以帮我吗?
非常感谢您
【问题讨论】:
-
你打电话给
car.setParking(car.getParking())这没有多大意义。您可能需要将其设置为检索到的停车位。但是:setParking需要Parking并且 似乎重复(很难说)停车过程。只有一个班级负责停车。