当应该有匹配的 JUnit 时,为什么我会收到断言错误?

问题描述

问题是测试无法识别汽车对象,即使它们是相同的。我收到 java.lang.assertion 错误。它们是错误的类型还是来自另一个错误?如果需要更多代码,请评论

错误

error

测试类:

import DAO.CarDAO;
import DAO.CarJdbcDAO;
import Domain.Car;
import java.math.BigDecimal;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertthat;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

/**
 *
 * @author shika823
 */
public class CarJdbcDAOTest {

    public CarJdbcDAOtest() {
    }

    /**
     *
     * @author shika823
     */
    private CarDAO dao = new CarJdbcDAO("jdbc:h2:mem:test;INIT=runscript from 'src/main/java/DAO/schema.sql'");

    private Car car1;

    private Car car2;

    private Car car3;

//    String carName,int carId,String carType,String seatNumber,BigDecimal hourlyCharge,String location) {
    @BeforeEach
    public void setUp() {
        car1 = new Car();
        car1.setCarId("12412");
        car1.setCarName("Car sokmet");
        car1.setCarType("A type");
        car1.setSeatNumber("1");
        car1.setHourlyCharge(new BigDecimal("4.00"));
        car1.setLocation("30 Duke Street");

        car2 = new Car();
        car2.setCarId("12902");
        car2.setCarName("Car sething");
        car2.setCarType("A tyjksspe");
        car2.setSeatNumber("2");
        car2.setHourlyCharge(new BigDecimal("3.00"));
        car2.setLocation("28 Duke Street");
//        
        car3 = new Car();
        car3.setCarId("1862");
        car3.setCarName("Car setng");
        car3.setCarType("yjksspe");
        car3.setSeatNumber("8");
        car3.setHourlyCharge(new BigDecimal("3.00"));
        car3.setLocation("98 Duke Street");
        
        
        dao.saveCar(car1);
        dao.saveCar(car2);

    }

    @AfterEach
    public void tearDown() {
        dao.removeCar(car1);
        dao.removeCar(car2);
    }

    @Test
    public void testSaveCar() {
        dao.saveCar(car3);

        assertthat(dao.getCars(),hasItem(car1));
        assertthat(dao.getCars(),hasItem(car2));
        assertthat(dao.getCars(),hasItem(car3));
        dao.removeCar(car3);

    }

    @Test
    public void testGetCars() {
        assertthat(dao.getCars(),hasItem(car1));
 
    }

    @Test
    public void testRemoveCar() {
        dao.removeCar(car1);
        assertthat(dao.getCars(),hasSize(1));
        assertthat(dao.getCars(),not(hasItem(car1)));
    }

}
 

这是我的 jdbc dao 类:

[enter image description here][1]import Domain.Car;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.sqlException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;

/**
 *
 * @author jamespettitt
 */
public class CarJdbcDAO implements CarDAO {

    private String url = JdbcConnection.getDefaultConnectionUri();

    public CarJdbcDAO() {
    }

    public CarJdbcDAO(String uri) {
        this.url = uri;
    }

    @Override
    public void saveCar(Car car) {
        String sql = "merge into car (car_id,car_Name,car_Type,Seat_Number,Hourly_Charge,Location) values (?,?,?)";

        try (
            Connection dbCon = JdbcConnection.getConnection(url);
            PreparedStatement stmt = dbCon.prepareStatement(sql);) {
            stmt.setString(1,car.getCarId());
            stmt.setString(2,car.getCarName());
            stmt.setString(3,car.getCarType());
            stmt.setString(4,car.getSeatNumber());
            stmt.setBigDecimal(5,car.getHourlyCharge());
            stmt.setString(6,car.getLocation());

            stmt.executeUpdate();

        } catch (sqlException ex) {
            throw new DAOException(ex.getMessage(),ex);
        }
    }

    @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(); 

            ArrayList<Car> cars = 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);
                                                

                cars.add(car); 

            }

            return cars;

        } catch (sqlException ex) {
            throw new DAOException(ex.getMessage(),ex);
        }
    }

    @Override
    public void removeCar(Car car) {

        String sql = "delete from car where car_ID = ?";

        try (
            Connection dbCon = JdbcConnection.getConnection(url);
            PreparedStatement stmt = dbCon.prepareStatement(sql);) {
            stmt.setString(1,car.getCarId());
            stmt.executeUpdate();

        } catch (sqlException ex) {
            throw new DAOException(ex.getMessage(),ex);
        }
    }

    @Override

    public Collection<Car> filterByType(String carType) {
        String sql = "select * from car where Type = ?";
        System.out.println(carType);
        try (
            Connection dbCon = JdbcConnection.getConnection(url);
            PreparedStatement stmt = dbCon.prepareStatement(sql);) {
            stmt.setString(1,carType);
            ResultSet rs = stmt.executeQuery();

            List<Car> typeList = new ArrayList<>();

            while (rs.next()) {
                Car car = new Car(
                    rs.getString("Car_id"),rs.getString("car_Name"),rs.getString("car_Type"),rs.getString("Seat_Number"),rs.getBigDecimal("Hourly_Charge"),rs.getString("Location")
                );
                System.out.println(car);
                typeList.add(car);
            }
            return typeList;
        } catch (sqlException ex) {
            throw new DAOException(ex.getMessage(),ex);
        }
    }

    @Override
    public Collection<Car> filterBySeatNumber(String seatNumber) {
        String sql = "select * from car where Seat_Number = ?";
        System.out.println(seatNumber);
        try (
            Connection dbCon = JdbcConnection.getConnection(url);
            PreparedStatement stmt = dbCon.prepareStatement(sql);) {
            stmt.setString(1,seatNumber);
            ResultSet rs = stmt.executeQuery();

            ArrayList<Car> seatNumberList = new ArrayList<>();

            while (rs.next()) {
                Car car = new Car(
                    rs.getString("Car_id"),rs.getString("Location")
                );
                System.out.println(car);
                seatNumberList.add(car);
            }
            return seatNumberList;
        } catch (sqlException ex) {
            throw new DAOException(ex.getMessage(),ex);
        }
    }

}
 

解决方法

可能您在使用 assertThat 时遇到问题,我建议使用 assertEquals 并检查每辆特定汽车的属性。

像这样:

 @Test
    public void testSaveCar() {
        dao.saveCar(car3);
    
        assertEquals(dao.getCars().get(0).getCarId(),car1.getCarId());
        assertEquals(dao.getCars().get(1).getCarId(),car2.getCarId());
        assertEquals(dao.getCars().get(2).getCarId(),car3.getCarId());
        dao.removeCar(car3);
    
    }

我还建议使用构造函数来创建每辆车 :)