[英]JUnit testing SQL queries
我正在做一個項目,我們需要創建一些測試用例。 我有一個 SQL 數據庫並使用以下查詢解析數據:
public Contractor create(String name, String address, String email, String phone, String city, int cvr) throws SQLException{
Contractor contractor = new Contractor(name, address, email, phone, city, cvr);
String sql = String.format("INSERT INTO person (name, address, email, phone, city, category) VALUES ('%s', '%s', '%s', '%s', '%s', 2)", name, address, email, phone, city);
try{
Connection conn = DBConnection.getInstance().getDBcon();
conn.createStatement().executeUpdate(sql);
String sql2 = "SELECT TOP 1 id FROM Person ORDER BY id DESC";
ResultSet rs = conn.createStatement().executeQuery(sql2);
if(rs.next()) {
String sql3 = "INSERT INTO contractor (cvr, person_id) VALUES (2666,"+rs.getInt("id")+")";
conn.createStatement().executeUpdate(sql3);
}else{
throw new SQLException();
}
} catch (SQLException e){
e.printStackTrace();
} finally {
DBConnection.closeConnection();
}
return contractor;
}
使用 JUnits 進行的測試會是什么樣子?
嗯,必須使用 Junit 的方式是通過測試您的類的每個公共方法,使用與實驗成功或失敗的數量一樣多的不同參數化。
那么,每種測試方法必須:
在您的情況下,很難檢查結果,因為連接是由您的方法在本地管理的。 更糟糕的是:數據會自動提交到連接中,每次測試都會在數據庫中留下臟記錄。
為了避免這種困難,只需稍加重構即可簡化測試開發:
create
,使用包訪問版本也接收連接,並將所有業務邏輯放在那里。然后,您可以安全地進行測試:
MyClass
, MyClassTest
在同一個包中創建一個MyClassTest
(通常在不同的源路徑中,如 Maven 項目中的src\\test\\java
)。createSinglePerson()
,它使用一組任意參數和一個連接(不是自動提交)調用create
。 之后,您必須檢查是否在Person表中比最初多一條記錄,具有一組特定的值,以及在Contractor表中是否有更多的記錄具有一組特定的值。 要比較每個值,您必須使用Asserts.assertEquals(expected, real)
。 最后(在 finally 子句中),回滾連接並關閉它。您可以根據需要多次運行測試,知道它不會改變數據庫狀態。
(注意:參數cvr
從來沒有使用過。也許你是故意的,我不知道)。
public class MyClassTest
{
@Test
public void createSinglePerson()
{
MyClass myClass=new MyClass();
try(Connection connection=...)
{
try(Statement stCheck=connection.createStatement())
{
connection.setAutoCommit(false);
// Initial cleanup:
stCheck.executeUpdate("DELETE FROM person");
stCheck.executeUpdate("DELETE FROM contractor");
// Setting input parameters:
String name="a";
String address="b";
String email="c@d.e";
String phone="001";
String city="f";
int cvr=11;
// Do the call:
Contractor contractor=myClass.create(name, address, email, phone, city, cvr);
// Javabean Checks: Check the javabean contains the expected values:
assertEquals(name, contractor.getName());
assertEquals(address, contractor.getAddress());
...
// Database Checks:
int personId;
// Check the Person table contains one row with the expected values:
try(ResultSet rs=stCheck.executeQuery("SELECT * FROM person"))
{
assertTrue(rs.next());
personId=rs.getInt("id");
asssertEquals(name, rs.getString("name"));
asssertEquals(address, rs.getString("address"));
...
assertFalse(rs.next());
}
// Check the Contractor table contains one row with the expected values:
try(ResultSet rs=stCheck.executeQuery("SELECT * FROM contractor WHERE person_id="+personId))
{
assertTrue(rs.next());
asssertEquals(2666, rs.getInt("cvr"));
...
assertFalse(rs.next());
}
}
finally
{
// Undo the testing operations:
connection.rollback();
}
}
catch (SQLException e)
{
fail(e.toString());
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.