【问题标题】:How should I define a collection method that returns an array?我应该如何定义一个返回数组的集合方法?
【发布时间】:2021-08-01 10:05:06
【问题描述】:

我想知道我应该怎么做才能正确返回数组列表。目前,我在 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);
        }
    }

 

【问题讨论】:

  • 错误在哪一行?您应该尝试制作一个小示例来说明问题,而不是显示大量不相关的代码。
  • 很抱歉。我已经更新了一张照片和更多细节。

标签: java arraylist junit collections dao


【解决方案1】:

getCars 返回一个与列表不同的Collection。具体来说,它不允许您使用索引获取项目。

断言集合包含某些项目的更好方法是使用:

assertThat(dao.getCars(), hasItems(car1, car2));

这是使用 Hamcrest 断言库,该库通常与 junit 一起使用。您可以使用其他断言库,例如 AssertJ,它允许:

assertThat(dao.getCars()).containsExactly(car1, car2);

如果您没有定义 equals,AssertJ 还允许您提取字段:

assertThat(dao.getCars()).extracting("id").contains(id1, id2);

【讨论】:

  • 感谢您的回复。我已经尝试过使用assertThat,但是即使它们相同,测试似乎也无法拾取对象。有没有可能我使用了错误的进口?使用 assertThat 链接到旧错误:stackoverflow.com/questions/67478929/…
  • 您需要为Car 定义equals 才能使断言起作用。
猜你喜欢
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多