2013-04-28 56 views
4

我正在實施基於Web服務的大學管理系統。這個系統增加了某些課程到數據庫。下面是我正在使用的代碼。具有DAO和Web服務的數據庫插入方法的Junit測試用例

Course.java

public class Course { 

    private String courseName; 
    private String location; 
    private String courseId; 


     public String getCourseId() 
       { 
     return courseId; 
      } 

    public void setCourseId(String courseId) { 
     this.courseId = courseId; 
    } 

    public String getCourseName() { 
     return courseName; 
    } 

    public void setCourseName(String courseName) { 
     this.courseName = courseName; 
    } 

     public String getLocation() { 
     return location; 
    } 
    public void setLocation(String location) { 
     this.location = location; 
    } 
} 

然後另一個文件是如下

CourseDaoImpl.java

public class CourseDaoImpl implements IDao { 
    Connection conn = null; 
    Statement stmt = null; 

public CourseDaoImpl(){ 

try { 
    Class.forName("com.mysql.jdbc.Driver").newInstance(); 
    conn = DriverManager.getConnection(
      "jdbc:mysql://localhost:3306/univesitydb", "root", "root"); 
    stmt = conn.createStatement(); 

    if (!conn.isClosed()) 
     System.out.println("Successfully connectiod"); 
} catch (SQLException e) { 
    e.printStackTrace(); 
} catch (InstantiationException e) { 
    e.printStackTrace(); 
} catch (IllegalAccessException e) { 
    e.printStackTrace(); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 
} 

     @Override 
    public String add(Object object) { 

Course c = (Course) object ; 

String courseId = c.getCourseId(); 
String courseName = c.getCourseName(); 
String location = c.getLocation(); 

String result = ""; 
int rowcount; 

try { 
    String query = "Insert into course (courseId,courseName,location) values" 
      + " ('" 
      + courseId 
      + "', '" 
      + courseName 
      + "', '" 
      + location 
      + "')"; 
    rowcount = stmt.executeUpdate(query); 
    if (rowcount > 0) { 
     result = "true"; 
     System.out.println("Course inserted successful"); 
    } else { 
     result = "false:The data could not be inserted in the databse"; 
    } 
} catch (SQLException e) { 
    e.printStackTrace(); 
} 

return result; 
} 

第三如下Web服務文件,其與交互前兩個並將數據添加到數據庫。

CourseService.java

package edu.service; 

      import edu.dao.IDao; 
      import edu.dao.impl.CourseDaoImpl; 
      import edu.db.entity.Course; 

     public class CourseService { 

    public String addCourse(String courseId, String courseName, String location) 
    { 
     Course c = new Course(); 
     c.setCourseId(courseId); 
     c.setCourseName(courseName); 
     c.setLocation(location);  
     IDao dao = new CourseDaoImpl(); 
     return dao.add(c); 
    } 

看着我的代碼清單,任何機構可以建議我我如何寫測試用例我的add方法。我完全是JAVA的初學者,我從朋友那裏學習了這個java部分,現在需要爲我的數據庫方法實現Junit測試,比如上面的add course。

請建議一些我可以學習,閱讀和使用的東西來實現我的數據庫方法的Junit測試。

回答

11

這是在彈簧項目使用JUnit一個樣本測試道。

import java.util.List; 

import junit.framework.Assert; 

import org.jboss.tools.example.springmvc.domain.Member; 
import org.jboss.tools.example.springmvc.repo.MemberDao; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.test.context.transaction.TransactionConfiguration; 
import org.springframework.transaction.annotation.Transactional; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:test-context.xml", 
"classpath:/META-INF/spring/applicationContext.xml"}) 
@Transactional 
@TransactionConfiguration(defaultRollback=true) 
public class MemberDaoTest 
{ 
    @Autowired 
    private MemberDao memberDao; 

    @Test 
    public void testFindById() 
    { 
     Member member = memberDao.findById(0l); 

     Assert.assertEquals("John Smith", member.getName()); 
     Assert.assertEquals("[email protected]", member.getEmail()); 
     Assert.assertEquals("2125551212", member.getPhoneNumber()); 
     return; 
    } 

    @Test 
    public void testFindByEmail() 
    { 
     Member member = memberDao.findByEmail("[email protected]"); 

     Assert.assertEquals("John Smith", member.getName()); 
     Assert.assertEquals("[email protected]", member.getEmail()); 
     Assert.assertEquals("2125551212", member.getPhoneNumber()); 
     return; 
    } 

    @Test 
    public void testRegister() 
    { 
     Member member = new Member(); 
     member.setEmail("[email protected]"); 
     member.setName("Jane Doe"); 
     member.setPhoneNumber("2125552121"); 

     memberDao.register(member); 
     Long id = member.getId(); 
     Assert.assertNotNull(id); 

     Assert.assertEquals(2, memberDao.findAllOrderedByName().size()); 
     Member newMember = memberDao.findById(id); 

     Assert.assertEquals("Jane Doe", newMember.getName()); 
     Assert.assertEquals("[email protected]", newMember.getEmail()); 
     Assert.assertEquals("2125552121", newMember.getPhoneNumber()); 
     return; 
    } 

    @Test 
    public void testFindAllOrderedByName() 
    { 
     Member member = new Member(); 
     member.setEmail("[email protected]"); 
     member.setName("Jane Doe"); 
     member.setPhoneNumber("2125552121"); 
     memberDao.register(member); 

     List<Member> members = memberDao.findAllOrderedByName(); 
     Assert.assertEquals(2, members.size()); 
     Member newMember = members.get(0); 

     Assert.assertEquals("Jane Doe", newMember.getName()); 
     Assert.assertEquals("[email protected]", newMember.getEmail()); 
     Assert.assertEquals("2125552121", newMember.getPhoneNumber()); 
     return; 
    } 
} 
+2

執行'memberDao.register(member)' 這個是正確的方法嗎?我認爲你必須嘗試獲取數據庫值並聲明這些值。因爲'memberDao.findById(id)'中的任何錯誤都可能對'testRegister()'方法有副作用。 – 2015-01-27 09:55:44

+0

@HariKrishnaGanji我認爲是對的。通過使用'findById(id)',在調用'register'之後,你實際上正在測試'findById'而不是'register'。這可能會影響'register'輸入某些值(bug)和'findById'返回一些默認值(buggy)時,因此可能不會被捕獲。 – Crocode 2015-07-08 05:49:25

3

您的課程設計將使其難以測試。使用硬編碼連接字符串或在您的方法中使用new實例化協作者可以被視爲測試反模式。看看DependencyInjection模式。像Spring這樣的框架可能對此有所幫助。

要測試DAO,您需要在單元測試中控制數據庫連接。所以你想要做的第一件事就是將它從你的DAO中提取出來,放到一個你可以模擬或指向一個特定測試數據庫的類中,你可以在測試運行前後設置和檢查它。

測試db/DAO代碼的技術解決方案可能是dbunit。您可以在無模式XML中定義測試數據,並讓dbunit將其填充到測試數據庫中。但是你仍然必須自己將所有東西都連接起來。然而,對於Spring,您可以使用類似spring-test-dbunit的東西,它可以爲您提供大量槓桿和附加工具。

正如你稱自己是初學者,我懷疑這是非常艱鉅的。你應該問自己,你是否真的需要測試你的數據庫代碼。如果沒有,你至少應該重構你的代碼,這樣你就可以輕鬆地模擬出所有的數據庫訪問。一般來說,嘲笑,看看Mockito

+0

感謝您的幫助,即使我從來沒有與泉工作。我不知道我是否應該測試自己的代碼,但是我的項目合作伙伴需要這樣做,我被分配了完成這項任務的任務。任何方式感謝您的幫助。我會期待的。 – 2013-04-28 23:09:37

-3

/*

公共類的UserDAO {

public boolean insertUser(UserBean u) { 
    boolean flag = false; 
    MySqlConnection msq = new MySqlConnection(); 
    try { 

     String sql = "insert into regis values(?,?,?,?,?)"; 

     Connection connection = msq.getConnection(); 
     PreparedStatement statement = null; 
     statement = (PreparedStatement) connection.prepareStatement(sql); 
     statement.setString(1, u.getname()); 
     statement.setString(2, u.getlname()); 
     statement.setString(3, u.getemail()); 
     statement.setString(4, u.getusername()); 
     statement.setString(5, u.getpasswords()); 
     statement.executeUpdate(); 

     flag = true; 
    } catch (Exception e) { 
    } finally { 
     return flag; 
    } 

} 

public String userValidate(UserBean u) { 
    String login = ""; 
    MySqlConnection msq = new MySqlConnection(); 
    try { 
     String email = u.getemail(); 
     String Pass = u.getpasswords(); 

     String sql = "SELECT name FROM regis WHERE email=? and passwords=?"; 
     com.mysql.jdbc.Connection connection = msq.getConnection(); 
     com.mysql.jdbc.PreparedStatement statement = null; 
     ResultSet rs = null; 
     statement = (com.mysql.jdbc.PreparedStatement) connection.prepareStatement(sql); 
     statement.setString(1, email); 
     statement.setString(2, Pass); 
     rs = statement.executeQuery(); 
     if (rs.next()) { 
      login = rs.getString("name"); 
     } else { 
      login = "false"; 
     } 

    } catch (Exception e) { 
    } finally { 
     return login; 
    } 
} 

public boolean getmessage(UserBean u) { 
    boolean flag = false; 
    MySqlConnection msq = new MySqlConnection(); 
    try { 


     String sql = "insert into feedback values(?,?)"; 

     Connection connection = msq.getConnection(); 
     PreparedStatement statement = null; 
     statement = (PreparedStatement) connection.prepareStatement(sql); 
     statement.setString(1, u.getemail()); 
     statement.setString(2, u.getfeedback()); 
     statement.executeUpdate(); 

     flag = true; 
    } catch (Exception e) { 
    } finally { 
     return flag; 
    } 

} 

public boolean insertOrder(cartbean u) { 
    boolean flag = false; 
    MySqlConnection msq = new MySqlConnection(); 
    try { 

     String sql = "insert into cart (product_id, email, Tprice, quantity) values (?,?,2000,?)"; 

     Connection connection = msq.getConnection(); 
     PreparedStatement statement = null; 
     statement = (PreparedStatement) connection.prepareStatement(sql); 
     statement.setString(1, u.getpid()); 
     statement.setString(2, u.getemail()); 
     statement.setString(3, u.getquantity()); 

     statement.executeUpdate(); 

     flag = true; 
    } catch (Exception e) { 
     System.out.print("hi"); 
    } finally { 
     return flag; 
    } 

} 

}

+1

用戶希望爲Junit CRUD操作測試提供解決方案! – 2014-01-06 07:01:44

0
@Test 
public void testSearchManagementStaff() throws SQLException 
{ 
    boolean res=true; 
    ManagementDaoImp mdi=new ManagementDaoImp(); 
    boolean b=mdi.searchManagementStaff("[email protected]"," 123456"); 
    assertEquals(res,b); 
}