簡體   English   中英

模擬 dao 在保存 object 時返回 false

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM