0

The problem is that the test not be recognizing the car object even though they are identical. I am getting a java.lang.assertion error. Are they of the wrong type or is this from another error? Please comment if more code is required.

The error: error

Testing class:

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)));
    }

}
 

Here is my jdbc dao class:

[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("car_Name"),
                    
                    rs.getString("car_Type"),
                    rs.getString("Seat_Number"),
                    rs.getBigDecimal("Hourly_Charge"),
                    rs.getString("Location")
                );
                System.out.println(car);
                seatNumberList.add(car);
            }
            return seatNumberList;
        } catch (SQLException ex) {
            throw new DAOException(ex.getMessage(), ex);
        }
    }

}
 
Parzival
  • 1,401
  • 1
  • 7
  • 18
stefanks
  • 11
  • 1
  • Please [edit] your question to include the source code of the `Car` class. Most likely you are not overriding the `equals()`/`hashcode()` methods. – Progman May 13 '21 at 12:03
  • Does this answer your question? [What issues should be considered when overriding equals and hashCode in Java?](https://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode-in-java) – Progman May 13 '21 at 13:38

1 Answers1

0

Probably you are having issues using assertThat, i suggest to use assertEquals and check an atributte of each specific car.

Something like this:

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

I suggest also using a constructor to create each car :)