如何在 Mockito 中为 if-else 编写测试用例
How to write test case for the if-else in Mockito
我正在尝试为以下代码编写测试用例
public boolean discharge(RegBean reg_data) {
boolean status = false;
try{
con = dbConObj();
PreparedStatement pst = con.prepareStatement("select * from patient where patientid=?");
pst.setString(1,reg_data.getpatientID());
ResultSet rs = (ResultSet) pst.executeQuery();
if (rs.next()){
String docname=rs.getString("docname").trim();
String pstatus=rs.getString("status").trim();
PreparedStatement ps=con.prepareStatement("update patient set ddate=?,status=? where patientID=?");
if (pstatus.equalsIgnoreCase("Active"))
{
ps.setString(1,new java.util.Date().toString());
ps.setString(2,"Discharged");
PreparedStatement pst1=con.prepareStatement("insert into history values(?,?,?,?)");
pst1.setString(1,docname);
pst1.setString(2,reg_data.getpatientID());
pst1.setString(3,"Discharged");
pst1.setString(4,new java.util.Date().toString());
pst1.executeUpdate();
}
else
if (pstatus.equalsIgnoreCase("Discharged"))
{
ps.setString(1,"");
ps.setString(2,"Active");
PreparedStatement pst1=con.prepareStatement("insert into history values(?,?,?,?)");
pst1.setString(1,docname);
pst1.setString(2,reg_data.getpatientID());
pst1.setString(3,"Active");
pst1.setString(4,new java.util.Date().toString());
pst1.executeUpdate();
9
}
ps.setString(3,reg_data.getpatientID());
ps.executeUpdate();
}
status = true;
}
catch(Exception e){
e.printStackTrace();
return status;
}
return status;
}
在第一个 if(rs.next())
的情况下,我嘲笑了 rs
并且我能够对其进行测试并获得报道。但是在第二种情况下,如果 if (pstatus.equalsIgnoreCase("Active"))
pstatus 是一个变量,我不能使用 DoReturn.when(mockedmethod)。有什么方法可以测试,以便在使用 JUnit 运行 时获得 测试覆盖率?
如果您已经为 rs.next() 模拟了结果集,您应该也能够做到
when(rs.getString("status")).thenReturn("Active");
展望未来,我会尝试将该方法分解为更小的方法,这些方法将模拟类型作为参数。它简化了整个测试用例,因为您不必准备和检查高度嵌套的模拟。这同样有助于处理语句类型。
旁注:您可能希望在返回之前关闭 ResultSet 和 Statements。
我正在尝试为以下代码编写测试用例
public boolean discharge(RegBean reg_data) {
boolean status = false;
try{
con = dbConObj();
PreparedStatement pst = con.prepareStatement("select * from patient where patientid=?");
pst.setString(1,reg_data.getpatientID());
ResultSet rs = (ResultSet) pst.executeQuery();
if (rs.next()){
String docname=rs.getString("docname").trim();
String pstatus=rs.getString("status").trim();
PreparedStatement ps=con.prepareStatement("update patient set ddate=?,status=? where patientID=?");
if (pstatus.equalsIgnoreCase("Active"))
{
ps.setString(1,new java.util.Date().toString());
ps.setString(2,"Discharged");
PreparedStatement pst1=con.prepareStatement("insert into history values(?,?,?,?)");
pst1.setString(1,docname);
pst1.setString(2,reg_data.getpatientID());
pst1.setString(3,"Discharged");
pst1.setString(4,new java.util.Date().toString());
pst1.executeUpdate();
}
else
if (pstatus.equalsIgnoreCase("Discharged"))
{
ps.setString(1,"");
ps.setString(2,"Active");
PreparedStatement pst1=con.prepareStatement("insert into history values(?,?,?,?)");
pst1.setString(1,docname);
pst1.setString(2,reg_data.getpatientID());
pst1.setString(3,"Active");
pst1.setString(4,new java.util.Date().toString());
pst1.executeUpdate();
9
}
ps.setString(3,reg_data.getpatientID());
ps.executeUpdate();
}
status = true;
}
catch(Exception e){
e.printStackTrace();
return status;
}
return status;
}
在第一个 if(rs.next())
的情况下,我嘲笑了 rs
并且我能够对其进行测试并获得报道。但是在第二种情况下,如果 if (pstatus.equalsIgnoreCase("Active"))
pstatus 是一个变量,我不能使用 DoReturn.when(mockedmethod)。有什么方法可以测试,以便在使用 JUnit 运行 时获得 测试覆盖率?
如果您已经为 rs.next() 模拟了结果集,您应该也能够做到
when(rs.getString("status")).thenReturn("Active");
展望未来,我会尝试将该方法分解为更小的方法,这些方法将模拟类型作为参数。它简化了整个测试用例,因为您不必准备和检查高度嵌套的模拟。这同样有助于处理语句类型。
旁注:您可能希望在返回之前关闭 ResultSet 和 Statements。