问题描述
我想知道我应该怎么做才能正确返回数组列表。目前,我在 get(o)、get(1) 等测试方法的每一行都收到此错误: 找不到标志 符号:方法 get(int) 位置:界面收藏
请看这里: error image
我也尝试过其他方法,例如assertthat,但都行不通。
@Test
public void testSaveCar() {
dao.saveCar(car3);
assertEquals(dao.getCars().get(0),car1.getCarId());
assertEquals(dao.getCars().get(1).getCarId(),car2.getCarId());
assertEquals(dao.getCars().get(2).getCarId(),car3.getCarId());
dao.removeCar(car3);
}
和一个看起来像这样的 jdbcdao 类:
/**
*
*
*/
public class CarJdbcDAO implements CarDAO {
private String url = JdbcConnection.getDefaultConnectionUri();
public CarJdbcDAO() {
}
public CarJdbcDAO(String uri) {
this.url = uri;
}
@Override
public Collection<Car> getCars() {
String sql = "select * from Car";
try (
Connection dbCon = JdbcConnection.getConnection(url); //get connection to db
PreparedStatement stmt = dbCon.prepareStatement(sql); //create stmt
) {
ResultSet rs = stmt.executeQuery();
List<Car> carsList = new ArrayList<>();
//iterate through query results
while (rs.next()) {
String carId = rs.getString("Car_Id");
String carName = rs.getString("Car_Name");
String carType = rs.getString("Car_Type");
String seatNumber = rs.getString("Seat_Number");
BigDecimal hourlyCharge = rs.getBigDecimal("Hourly_Charge");
String location = rs.getString("Location");
Car car = new Car(carId,carName,carType,seatNumber,hourlyCharge,location);
carsList.add(car);
}
return carsList;
} catch (sqlException ex) {
throw new DAOException(ex.getMessage(),ex);
}
}
解决方法
getCars
返回一个与列表不同的 Collection
。具体来说,它不允许您使用索引获取项目。
断言集合包含某些项目的更好方法是使用:
assertThat(dao.getCars(),hasItems(car1,car2));
这是使用 Hamcrest 断言库,这是通常与 junit 一起使用的库。您可以使用替代断言库,例如 AssertJ,它允许:
assertThat(dao.getCars()).containsExactly(car1,car2);
AssertJ 还允许您在未定义 equals
的情况下提取字段:
assertThat(dao.getCars()).extracting("id").contains(id1,id2);