2013-04-28 7 views
4

웹 서비스 기반 대학 관리 시스템을 구현 중입니다. 이 시스템은 특정 코스를 데이터베이스에 추가합니다. 여기 아래 코드는 제가 사용하고있는 코드입니다.DAO 및 웹 서비스를 사용하는 데이터베이스 삽입 방법에 대한 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; 
} 

제 아래와 같이된다 이전 2 개를 선택하고 데이터베이스에 데이터를 추가합니다.

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); 
    } 

내 코드 목록을 보면 어떤 몸은 내 추가 방법에 대한 테스트 케이스를 쓰기 어떻게 저를 제안 할 수 있습니다. 나는 자바에 대해 완전히 초보자이다. 나는이 자바 파트를 배우기 위해 친구들로부터 도움을 받았고, 위의 코스 추가와 같은 데이터베이스 메소드를위한 Junit 테스트를 구현해야한다.

내 데이터베이스 메서드에 대한 Junit 테스트를 구현하기 위해 배우고 읽고 사용할 수있는 몇 가지 방법을 제안하십시오.

답변

11

이 봄 프로젝트에서의 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("[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]ator.com", newMember.getEmail()); 
     Assert.assertEquals("2125552121", newMember.getPhoneNumber()); 
     return; 
    } 
} 
+2

'testRegister()'테스트 메소드에서'memberDao.register (member)'를 수행 한 후 DAO 메소드'Member newMember = memberDao.findById (id)'를 사용하고 있습니다. 올바른 방법입니까? 난 당신이 시도하고 데이터베이스 값을 가져와 그 값을 주장해야한다고 생각해. 'memberDao.findById (id)'의 버그가'testRegister()'메소드에 부작용을 줄 수 있기 때문입니다. –

+0

@HariKrishnaGanji 나는 그것이 옳다고 생각한다. 'findById (id)'를 사용하여,'register'를 호출 한 후에, 실제로'register'가 아니라'findById'를 테스트하고 있습니다. 그리고 이것은'register'가 어떤 값 (버그)을 입력하지 못하고'findById'가 어떤 디폴트 값 (버그가 있음)을 반환 할 때 영향을받을 수 있습니다. 따라서 잡히지 않을 수 있습니다. – Crocode

3

클래스 디자인 때문에 테스트하기가 어려울 수 있습니다. 으로 하드 코드 된 연결 문자열을 사용하거나 메서드에서 공동 작업자를 인스턴스화하는 것은 테스트 - 반 패턴으로 간주 할 수 있습니다. DependencyInjection 패턴을 살펴보십시오. Spring과 같은 프레임 워크가 도움이 될 수 있습니다.

DAO를 테스트하려면 유닛 테스트에서 데이터베이스 연결을 제어해야합니다. 따라서 가장 먼저 할 일은 DAO에서 추출하여 테스트를 실행하기 전후에 특정 테스트 데이터베이스를 가리키게하거나 모의 할 수있는 클래스로 추출하는 것입니다.

db/DAO 코드 테스트를위한 기술적 솔루션은 dbunit 일 수 있습니다. 테스트 데이터를 스키마가없는 XML로 정의하고 dbunit이 테스트 데이터베이스에서이를 채우도록 할 수 있습니다. 그러나 당신은 여전히 ​​모든 것을 스스로 연결해야합니다. 그러나 스프링을 사용하면 spring-test-dbunit과 같은 것을 사용할 수 있습니다.이 도구는 많은 도구와 도구를 제공합니다.

당신이 자신을 초보자라고 부를 때 나는 이것이 매우 힘든 일이라고 생각한다. 데이터베이스 코드를 실제로 테스트해야하는 경우 스스로에게 문의해야합니다. 그렇지 않으면 최소한 코드를 리팩토링해야하므로 모든 데이터베이스 액세스를 쉽게 조롱 할 수 있습니다. 조롱을 위해서는 일반적으로 Mockito을보십시오.

+0

덕분에, 심지어 내가 스프링스와 함께 일한 적이있다.실제로 코드를 테스트해야하는지 여부는 많이 알지 못하지만 프로젝트 파트너는 코드를 수행해야하며 코드 작성 작업을 할당 받았습니다. 도움을 주셔서 감사합니다. 나는 그것을 고대 할 것이다. –

-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 작업 테스트를위한 솔루션을 원합니다! –

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