2013-04-28 42 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); 
}