【问题标题】:Junit test case for database insert method with DAO and web service使用 DAO 和 Web 服务的数据库插入方法的 Junit 测试用例
【发布时间】:2013-04-22 03:03:02
【问题描述】:

我正在实施一个基于网络服务的大学管理系统。该系统将某些课程添加到数据库中。下面是我正在使用的代码。

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 测试,比如上面的添加课程。

请提出一些我可以学习、阅读和使用的东西来为我的数据库方法实施 Junit 测试。

【问题讨论】:

    标签: java web-services junit dao testcase


    【解决方案1】:

    这是一个在 spring 项目中使用 junit 的示例 dao 测试。

    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("john.smith@mailinator.com", member.getEmail());
            Assert.assertEquals("2125551212", member.getPhoneNumber());
            return;
        }
    
        @Test
        public void testFindByEmail()
        {
            Member member = memberDao.findByEmail("john.smith@mailinator.com");
    
            Assert.assertEquals("John Smith", member.getName());
            Assert.assertEquals("john.smith@mailinator.com", member.getEmail());
            Assert.assertEquals("2125551212", member.getPhoneNumber());
            return;
        }
    
        @Test
        public void testRegister()
        {
            Member member = new Member();
            member.setEmail("jane.doe@mailinator.com");
            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("jane.doe@mailinator.com", newMember.getEmail());
            Assert.assertEquals("2125552121", newMember.getPhoneNumber());
            return;
        }
    
        @Test
        public void testFindAllOrderedByName()
        {
            Member member = new Member();
            member.setEmail("jane.doe@mailinator.com");
            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("jane.doe@mailinator.com", newMember.getEmail());
            Assert.assertEquals("2125552121", newMember.getPhoneNumber());
            return;
        }
    }
    

    【讨论】:

    • 在测试方法testRegister()中你使用的是DAO方法Member newMember = memberDao.findById(id),在执行memberDao.register(member)之后这是正确的做法吗?我认为您必须尝试获取数据库值并断言这些值。因为来自memberDao.findById(id) 的任何错误都可能对您的testRegister() 方法产生副作用。
    • @HariKrishnaGanji 我认为这是对的。通过使用findById(id),在调用register 之后,您实际上是在测试findById 而不是register。这可能会影响register 无法输入某些值(错误)并且findById 返回一些默认值(错误),因此可能不会被捕获。
    • 谁能解释一下 - 什么是“classpath:test-context.xml”条目,该文件中应该包含什么?
    • 我有一点疑问。在这种情况下,当我们每次构建项目时,值都会插入到数据库的所有表中。 (考虑到所有插入方法都有测试用例。)可能有多个测试用例,每个构建都会将值插入数据库。我不认为这会是一件好事。(在生产环境中)
    • @Crocode,只是一个想法。如果成功,首先运行 testFindById() 的测试用例,然后我们只需要运行 testRegister() 的测试。我们可以这样做吗?无论如何,如果使用 testFindById() 获取数据失败,构建将不会成功。
    【解决方案2】:

    您的类的设计会使测试它们变得困难。在您的方法中使用硬编码的连接字符串或使用new 实例化协作者可以被视为测试反模式。看看DependencyInjection 模式。像 Spring 这样的框架在这​​里可能会有所帮助。

    要测试您的 DAO,您需要在单元测试中控制数据库连接。所以你要做的第一件事就是将它从你的 DAO 中提取到一个类中,你可以模拟或指向一个特定的测试数据库,你可以在测试运行之前和之后设置和检查它。

    测试 db/DAO 代码的技术解决方案可能是 dbunit。您可以在无模式 XML 中定义您的测试数据,并让 dbunit 将其填充到您的测试数据库中。但是您仍然必须自己连接所有内容。但是,对于 Spring,您可以使用 spring-test-dbunit 之类的东西,它为您提供了很多杠杆作用和额外的工具。

    当您称自己为初学者时,我怀疑这一切都非常令人生畏。您应该问问自己是否真的需要测试您的数据库代码。如果不是,您至少应该重构您的代码,以便您可以轻松地模拟所有数据库访问。对于一般的模拟,请查看Mockito。

    【讨论】:

    • 感谢您的帮助,即使我从未与 Springs 合作过。我不太清楚我是否真的应该测试我的代码,但我的项目合作伙伴需要这样做,我被分配了这样做的任务。任何方式感谢您的帮助。我会期待的。
    【解决方案3】:
    @Test
    public void testSearchManagementStaff() throws SQLException
    {
        boolean res=true;
        ManagementDaoImp mdi=new ManagementDaoImp();
        boolean b=mdi.searchManagementStaff("abc@gmail.com"," 123456");
        assertEquals(res,b);
    }
    

    【讨论】:

      【解决方案4】:

      /*

      公共类 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;
          }
      
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-25
        • 1970-01-01
        • 1970-01-01
        • 2020-10-07
        • 2015-08-31
        • 2014-07-15
        • 2014-09-19
        • 2019-12-30
        相关资源
        最近更新 更多