【发布时间】:2021-02-27 09:12:00
【问题描述】:
大家好,我是新来的,我需要您的帮助来使用 junit 对带有连接池的 DAO 类进行单元测试。 这是 ConPool:
public class ConPool {
private static DataSource datasource;
/**
* {@return} Connection
* {@throws} SQLException
* Ritorna la connessione al db.
*/
public static Connection getConnection() throws SQLException {
if (datasource == null) {
PoolProperties p = new PoolProperties();
p.setUrl("jdbc:mysql://localhost:3306/GameLand?serverTimezone="
+ TimeZone.getDefault().getID());
p.setDriverClassName("com.mysql.cj.jdbc.Driver");
p.setUsername("root");
p.setPassword("basedidati");
p.setMaxActive(100);
p.setInitialSize(10);
p.setMinIdle(10);
p.setRemoveAbandonedTimeout(60);
p.setRemoveAbandoned(true);
datasource = new DataSource();
datasource.setPoolProperties(p);
}
return datasource.getConnection();
}
}
这是我要测试的 DAO 类:
public class OrdineDAO {
/**
* {@return} ArrayList of Ordine.
*/
public synchronized ArrayList<Ordine> doRetrieveAll() {
String query = "SELECT * FROM ordine";
ArrayList<Ordine> result = new ArrayList<Ordine>();
try (Connection conn = ConPool.getConnection()) {
PreparedStatement ps = conn.prepareStatement(query);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Ordine ord = new Ordine();
ord.setConsegnato(rs.getBoolean("consegnato"));
ord.setDataOra(rs.getString("dataOra"));
ord.setIdOrdine(rs.getInt("idOrdine"));
ord.setIdProdotto(rs.getInt("idProdotto"));
ord.setPrezzoFis(rs.getDouble("prezzoFis"));
ord.setPrezzoDig(rs.getDouble("prezzoDig"));
ord.setIva(rs.getDouble("iva"));
ord.setQuantitaDigitale(rs.getInt("quantitaDigitale"));
ord.setQuantitaFisico(rs.getInt("quantitaFisico"));
ord.setIdUtente(rs.getInt("idUtente"));
result.add(ord);
}
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
/**
* {@param} id: int.
* {@return} ArrayList of Ordine.
*/
public synchronized ArrayList<Ordine> doRetrieveByUser(int id) {
PreparedStatement ps = null;
String query = "SELECT * FROM ordine WHERE idUtente = ?";
ArrayList<Ordine> result = new ArrayList<Ordine>();
try (Connection conn = ConPool.getConnection()) {
ps = conn.prepareStatement(query);
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Ordine ord = new Ordine();
ord.setConsegnato(rs.getBoolean("consegnato"));
ord.setDataOra(rs.getString("dataOra"));
ord.setIdOrdine(rs.getInt("idOrdine"));
ord.setIdProdotto(rs.getInt("idProdotto"));
ord.setPrezzoFis(rs.getDouble("prezzoFis"));
ord.setPrezzoDig(rs.getDouble("prezzoDig"));
ord.setIva(rs.getDouble("iva"));
ord.setQuantitaDigitale(rs.getInt("quantitaDigitale"));
ord.setQuantitaFisico(rs.getInt("quantitaFisico"));
ord.setIdUtente(rs.getInt("idUtente"));
result.add(ord);
}
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
/**
* {@param} data1: String.
* {@param} data2: String.
* {@return} ArrayList of Ordine.
*/
public synchronized ArrayList<Ordine> doRetrieveByDate(String data1, String data2) {
PreparedStatement ps = null;
String query = "SELECT * FROM ordine WHERE dataOra >= ? AND dataOra <= ?";
ArrayList<Ordine> result = new ArrayList<Ordine>();
try (Connection conn = ConPool.getConnection()) {
ps = conn.prepareStatement(query);
ps.setString(1, data1);
ps.setString(2, data2);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Ordine ord = new Ordine();
ord.setConsegnato(rs.getBoolean("consegnato"));
ord.setDataOra(rs.getString("dataOra"));
ord.setIdOrdine(rs.getInt("idOrdine"));
ord.setIdProdotto(rs.getInt("idProdotto"));
ord.setPrezzoFis(rs.getDouble("prezzoFis"));
ord.setPrezzoDig(rs.getDouble("prezzoDig"));
ord.setIva(rs.getDouble("iva"));
ord.setQuantitaDigitale(rs.getInt("quantitaDigitale"));
ord.setQuantitaFisico(rs.getInt("quantitaFisico"));
ord.setIdUtente(rs.getInt("idUtente"));
result.add(ord);
}
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
}
首先从 doRetrieveAll 方法开始,我尝试做一个
@Test
public void doRetrieveAll_Success() throws SQLException {
assertNotNull(ordineDAO.doRetrieveAll());
}
但我需要知道如何设置 @BeforeAll 才能测试此方法。 你能帮我理解如何正确设置测试类吗?谢谢
【问题讨论】:
-
从您的 sn-ps 来看,您实际上并不需要
@Before/@BeforeAll方法 - 您拥有它的方式应该可以工作。
标签: java unit-testing testing junit