Java 使用DAO和web服务的数据库插入方法的Junit测试用例
我正在实施一个基于Web服务的大学管理系统。该系统将某些课程添加到数据库中。下面是我正在使用的代码 Course.javaJava 使用DAO和web服务的数据库插入方法的Junit测试用例,java,web-services,junit,dao,testcase,Java,Web Services,Junit,Dao,Testcase,我正在实施一个基于Web服务的大学管理系统。该系统将某些课程添加到数据库中。下面是我正在使用的代码 Course.java public class Course { private String courseName; private String location; private String courseId; public String getCourseId() { return courseI
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;
}
}
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;
}
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);
}
然后另一个文件如下所示
CourseDaoImpl.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;
}
}
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;
}
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);
}
第三个是Web服务文件,如下所示,它与前两个文件交互并将数据添加到数据库中
CourseService.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;
}
}
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;
}
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课程
请推荐一些我可以学习、阅读和使用的东西,以便为我的数据库方法实现Junit测试。您的类的设计将使测试它们变得困难。在方法中使用硬编码连接字符串或使用
new
实例化协作者可以被视为测试反模式。看一下图案。像这样的框架在这里可能会有所帮助
要测试DAO,您需要在单元测试中控制数据库连接。因此,您要做的第一件事是将其从DAO中提取到一个类中,您可以模拟或指向特定的测试数据库,您可以在测试运行之前和之后对其进行设置和检查
测试db/DAO代码的技术解决方案可能是。您可以在无模式的XML中定义测试数据,并让dbunit将其填充到测试数据库中。但你还是得自己把一切都连接起来。然而,对于Spring,您可以使用这样的工具,它可以为您提供大量的杠杆和额外的工具
当你称自己为一个完全的初学者时,我怀疑这一切都是令人畏惧的。您应该问问自己是否真的需要测试数据库代码。否则,至少应该重构代码,这样就可以轻松模拟所有数据库访问。对于一般的模拟,请查看。/*
公共类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;
}
}
}这是一个在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;
}
}
import java.util.List;
导入junit.framework.Assert;
导入org.jboss.tools.example.springmvc.domain.Member;
导入org.jboss.tools.example.springmvc.repo.MemberDao;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.test.context.ContextConfiguration;
导入org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
导入org.springframework.test.context.transaction.TransactionConfiguration;
导入org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(位置={“classpath:test context.xml”,
“classpath:/META-INF/spring/applicationContext.xml”})
@交易的
@TransactionConfiguration(defaultRollback=true)
公共类成员测试
{
@自动连线
私人会员,会员,;
@试验
公共void testFindById()
{
成员=memberDao.findById(0l);
Assert.assertEquals(“John Smith”,member.getName());
Assert.assertEquals(“约翰。smith@mailinator.com,member.getEmail());
Assert.assertEquals(“2125551212”,member.getPhoneNumber());
返回;
}
@试验
public void testFindByEmail()
{
Member=memberDao.findByEmail(“约翰。smith@mailinator.com");
Assert.assertEquals(“John Smith”,member.getName());
Assert.assertEquals(“约翰。smith@mailinator.com,member.getEmail());
Assert.assertEquals(“2125551212”,member.getPhoneNumber());
返回;
}
@试验
公共无效测试寄存器()
{
成员=新成员();
setEmail(“jane。doe@mailinator.com");
成员:setName(“Jane Doe”);
成员。设置电话号码(“2125552121”);
成员。注册(成员);
Long id=member.getId();
Assert.assertNotNull(id);
Assert.assertEquals(2,memberDao.findAllOrderedByName().size());
成员newMember=memberDao.findById(id);
Assert.assertEquals(“Jane Doe”,newMember.getName());
Assert.assertEquals(“简。doe@mailinator.com,newMember.getEmail());
Assert.assertEquals(“2125552121”,newMember.getPhoneNumber());
返回;
}
@试验
public void testFindAlloweredByName()
{
成员=新成员();
setEmail(“jane。doe@mailinator.com");
成员:setName(“Jane Doe”);
成员。设置电话号码(“2125552121”);
成员。注册(成员);
List members=memberDao.findAllOrderedByName();
Assert.assertEquals(2,members.size());
成员newMember=members.get(0);
Assert.assertEquals(“Jane Doe”,newMember.getName());
Assert.assertEquals(“简。doe@mailinator.com,newMember.getEmail());
Assert.assertEquals(“2125552121”,newMember.getPhoneNumber());
返回;
}
}
谢谢你的帮助,即使我从未使用过弹簧。我不知道我是否真的应该测试我的代码,但我的项目合作伙伴需要这样做,我被分配了这样做的任务。不管怎样,谢谢你的帮助。在测试方法testRegister()
中,您正在使用DAO方法Member newMember=memberDao.findById(id)
,在执行memberDao.register(Member)
之后,这是正确的方法吗?我认为您必须尝试获取数据库值并断言这些值。因为memberDao.findById(id)
中的任何bug都可能对您的testRegister()
方法产生副作用。@HariKrishnaGanji我认为这是正确的。通过使用findById(id)
,在调用register
之后,实际上是在测试findById
,而不是register
。这可能会影响注册的时间