[英]Mocked dao returns false when saving an object
我是測試驅動開發的新手。 我正在嘗試測試 object 是否已成功保存到我的數據庫中。 到目前為止我的代碼:
@ExtendWith(MockitoExtension.class)
public class ParkingDataBaseIT {
@Mock
private TicketDAO mockTicketDAO;
@Mock
public static DataBaseTestConfig mockDataBaseTestConfig = new DataBaseTestConfig();
@Mock
private static Connection mockConnection;
@BeforeEach
public void setup() throws SQLException, ClassNotFoundException {
// Connection attempt.
when(mockDataBaseTestConfig.getConnection()).thenReturn(mockConnection);
}
@AfterAll
public static void tearDown() {
// ...
}
@DisplayName("Tests if saving a ticket is successful.")
@Test
public void testParkingACarAlpha() throws SQLException, ClassNotFoundException {
// Given.
Date inTime = new Date();
Ticket ticket = new Ticket();
ticket.setVehicleRegNumber("ABCDEF");
ticket.setPrice(0);
ticket.setInTime(inTime);
ticket.setOutTime(null);
// When.
// MockDao always returning false when saving.
final boolean saved = mockTicketDAO.saveTicket(ticket, mockDataBaseTestConfig.getConnection());
// Then.
assertEquals(true, saved);
assertThat(saved).isEqualTo(true);
}
}
這是與 MySQL 建立連接的方法:
public Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/testing", "root", "");
}
最后,這就是我保存機票的方式:
public boolean saveTicket(Ticket ticket, Connection con) {
try {
PreparedStatement ps = con.prepareStatement("insert into ticket(vehicleRegNumber, price, inTime, outTime) values(?, ?, ?, ?, ?)");
ps.setInt(1, ticket.getParkingSpot().getId());
ps.setString(2, ticket.getVehicleRegNumber());
ps.setDouble(3, ticket.getPrice());
ps.setTimestamp(4, new Timestamp(ticket.getInTime().getTime()));
ps.setTimestamp(5, (ticket.getOutTime() == null) ? null: (new Timestamp(ticket.getOutTime().getTime())));
return ps.execute();
} catch (Exception e) {
logger.error("Cannot fetch available slot.", e);
} finally {
dataBaseConfig.closeConnection(con);
}
return false;
}
使用 MySQL 的請求有效,但在保存 object 時,我從 ps.execute() 得到一個錯誤; 而不是真的,但我肯定做錯了什么。
我注意到saveTicket(Ticket ticket, Connection con)
中的ps
是 null(無法調用“java.sql.PreparedStatement.setInt(int, int)”,因為“ps”為空),但是當我 sysout 值時con
具有 mockConnection。
由於mockDataBaseTestConfig.getConnection()總是返回 null,顯然是行不通的。
審查后,我只通過 mocking dao 使其工作(注意測試已重命名為 testSavingTicket_shouldReturnTrue)。
private Ticket t;
@Test
public void testSavingTicket_shouldReturnTrue() throws SQLException, ClassNotFoundException {
// Given.
TicketDAO mockTicketDao = mock(TicketDAO.class);
t = new Ticket();
t.setVehicleRegNumber("ABCDEF");
t.setPrice(0);
t.setInTime(new Date());
t.setOutTime(null);
when(mockTicketDao.saveTicket(t)).thenReturn(true);
// When.
final boolean saved = mockTicketDao.saveTicket(t);
// Then.
assertEquals(true, saved);
assertThat(saved).isEqualTo(true);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.