web-dev-qa-db-ja.com

DAOおよびWebサービスを使用したデータベース挿入メソッドのJunitテストケース

Webサービスベースの大学管理システムを実装しています。このシステムは、特定のコースをデータベースに追加します。以下は私が使用しているコードです。

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

3番目は、前の2つと相互作用してデータベースにデータを追加する次のような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テストを実装するために、学び、読み、使用できることを提案してください。

8
Jyot Mankad

これは、スプリングプロジェクトでjunitを使用した1つのサンプル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]", newMember.getEmail());
        Assert.assertEquals("2125552121", newMember.getPhoneNumber());
        return;
    }
}
19
Ravi Kant

クラスの設計により、テストが難しくなります。ハードコードされた接続文字列を使用するか、newを使用してメソッドでコラボレーターをインスタンス化することは、テストアンチパターンと見なすことができます。 DependencyInjection パターンを見てください。 Spring のようなフレームワークが役立つ場合があります。

DAOをテストするには、ユニットテストでデータベース接続を制御する必要があります。したがって、最初にしたいことは、DAOから特定のテストデータベースをモックまたはポイントできるクラスに抽出することです。テストデータベースは、テストの実行前後にセットアップおよび検査できます。

Db/DAOコードをテストするための技術的なソリューションは、 dbunit です。スキーマレスXMLでテストデータを定義し、dbunitでテストデータベースにデータを入力できます。ただし、すべてを自分で接続する必要があります。ただし、Springでは spring-test-dbunit のようなものを使用できます。これにより、多くのレバレッジと追加のツールが提供されます。

あなたが自分を完全な初心者と呼んでいるので、私はこれがすべて非常に困難だと思う。データベースコードを本当にテストする必要があるかどうかを自問する必要があります。そうでない場合は、少なくともコードをリファクタリングする必要があるため、すべてのデータベースアクセスを簡単にモックアウトできます。一般的なモックについては、 Mockito をご覧ください。

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