web-dev-qa-db-fra.com

Cas de test Junit pour la méthode d'insertion de base de données avec DAO et service Web

J'implémente un système de gestion universitaire basé sur un service Web. Ce système ajoute certains cours à la base de données. ci-dessous est le code que j'utilise.

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

puis un autre fichier est comme ci-dessous

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

le troisième est le fichier de service Web suivant qui interagit avec les deux précédents et ajoute des données à la base de données.

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

En regardant mes listes de codes, n'importe quel organisme peut me suggérer comment écrire un cas de test pour ma méthode d'ajout. Je suis totalement débutant pour Java, j'ai pris l'aide de mes amis pour apprendre ceci Java et maintenant besoin d'implémenter le test Junit pour mes méthodes de base de données comme ajouter un cours ci-dessus.

Veuillez suggérer quelque chose que je peux apprendre, lire et utiliser pour implémenter les tests Junit pour mes méthodes de base de données.

8
Jyot Mankad

Ceci est un exemple de test dao utilisant le projet junit au printemps.

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

La conception de vos classes rendra difficile leur test. L'utilisation de chaînes de connexion codées en dur ou d'instanciation de collaborateurs dans vos méthodes avec new peut être considérée comme un test-antipatterns. Jetez un œil au modèle DependencyInjection . Des cadres comme Spring pourraient être utiles ici.

Pour faire tester votre DAO, vous devez contrôler votre connexion à la base de données dans vos tests unitaires. Donc, la première chose que vous voudriez faire est de l'extraire de votre DAO dans une classe que vous pouvez soit simuler, soit pointer vers une base de données de test spécifique, que vous pouvez configurer et inspecter avant et après l'exécution de vos tests.

Une solution technique pour tester le code db/DAO pourrait être dbunit . Vous pouvez définir vos données de test dans un XML sans schéma et laisser dbunit les remplir dans votre base de données de test. Mais vous devez toujours tout câbler vous-même. Avec Spring, cependant, vous pouvez utiliser quelque chose comme spring-test-dbunit qui vous donne beaucoup de levier et d'outils supplémentaires.

Comme vous vous appelez un débutant total, je pense que tout cela est très intimidant. Vous devriez vous demander si vous avez vraiment besoin de tester le code de votre base de données. Sinon, vous devez au moins refactoriser votre code, afin de pouvoir facilement simuler tous les accès à la base de données. Pour se moquer en général, jetez un œil à 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