如何为Dao类编写Junit测试用例?

如何为Dao类编写Junit测试用例?,junit,tdd,clover,Junit,Tdd,Clover,这是我的dao类,有人能告诉我这个dao方法的模式吗 public String getProcessNames() throws IOException{ Gson gson=new Gson(); JSONObject output=new JSONObject(); String responseGson; Session session = ConnectionDAO.getBoltSession(); String query = qpObj.g

这是我的dao类,有人能告诉我这个dao方法的模式吗

public String getProcessNames() throws IOException{
    Gson gson=new Gson();
    JSONObject output=new JSONObject();
    String responseGson;
    Session session = ConnectionDAO.getBoltSession();
    String query = qpObj.getQueryValue("neo4j.processMonitor.getProcessNames");
    StatementResult result = session.run(query);
    JSONArray dataArray= new JSONArray();
    try{
        while ( result.hasNext() )
        {
            Record record = result.next();
            responseGson=gson.toJson(record.asMap());
            JSONObject responseJson=new JSONObject(responseGson);
            dataArray.put(responseJson.get("ProcessName"));
            output.put("results",dataArray);

        }
    }
    catch(Exception e){
        e.printStackTrace();
    }
    finally{
        if(session.isOpen()){
            session.close();
        }
    }
    return output.toString();
}
或者任何人都可以提供直接链接供参考,这对我很好。
谢谢,关于测试,有一点是它也能带来更好的代码,因为坏代码通常不太容易测试。但是在我们开始之前,让我们从一个简单的考虑开始:您想要测试什么

a) 您可以测试方法本身,而无需连接到数据库,这将是一个单元测试

b) 您可以测试方法和数据库结果,这更像是一个集成测试

就我个人而言,我会同时做这两件事,编写单元测试和集成测试,因为两者都有各自的用途(单元测试更快,可以更频繁地运行,集成测试将测试更多)。但是让我们从单元测试开始

单元测试的主要问题是

Session session = ConnectionDAO.getBoltSession();
这种静态调用使一切变得困难。当然,您可以通过为单元测试初始化ConnectionDAO的方式对其进行编码,例如通过创建

ConnectionDAO.initForTestOnly();
…方法,但这意味着您的ConnectionDAO有两个作业,第一个是实际的DAO,第二个是测试工具。这不是一个好主意,因为一个类应该只做一件事

所以,我们通常会模仿一些东西。对于模拟的内容,您必须将dependencide提供给要模拟的类,而不是将它们硬编码到类中,例如

class YourClass {

  private ConnectionDAO connectionDAO;

  public YourClass(ConnectioNDAO connectionDao) {
    this.connectionDAO = connectionDAO;
  }

  public String getProcessNames() throws IOException{
     ...
     Session session =  this.connectionDAO.getBoltSession();
     ...
  }

}
这消除了对静态类的需要,现在您可以在测试类中模拟connectionDAO

class YourClassTest {

   public void testGetProcessNames() throws IOException {
       ConnectionDAO connectionDAOMock = Mockito.mock(ConnectionDAO.class);
       YourClass yourClass = new YourClass(connectionDAOMock);

       //...init the mock here, see the Mockito documentation for that

       String result = yourClass.getProcessNames();


   }

}

也许您需要对
qpObj
执行同样的操作。希望这一基本想法能对开始有所帮助……

好吧,关于测试的一点是,它也会带来更好的代码,因为坏代码通常不太容易测试。但是在我们开始之前,让我们从一个简单的考虑开始:您想要测试什么

a) 您可以测试方法本身,而无需连接到数据库,这将是一个单元测试

b) 您可以测试方法和数据库结果,这更像是一个集成测试

就我个人而言,我会同时做这两件事,编写单元测试和集成测试,因为两者都有各自的用途(单元测试更快,可以更频繁地运行,集成测试将测试更多)。但是让我们从单元测试开始

单元测试的主要问题是

Session session = ConnectionDAO.getBoltSession();
这种静态调用使一切变得困难。当然,您可以通过为单元测试初始化ConnectionDAO的方式对其进行编码,例如通过创建

ConnectionDAO.initForTestOnly();
…方法,但这意味着您的ConnectionDAO有两个作业,第一个是实际的DAO,第二个是测试工具。这不是一个好主意,因为一个类应该只做一件事

所以,我们通常会模仿一些东西。对于模拟的内容,您必须将dependencide提供给要模拟的类,而不是将它们硬编码到类中,例如

class YourClass {

  private ConnectionDAO connectionDAO;

  public YourClass(ConnectioNDAO connectionDao) {
    this.connectionDAO = connectionDAO;
  }

  public String getProcessNames() throws IOException{
     ...
     Session session =  this.connectionDAO.getBoltSession();
     ...
  }

}
这消除了对静态类的需要,现在您可以在测试类中模拟connectionDAO

class YourClassTest {

   public void testGetProcessNames() throws IOException {
       ConnectionDAO connectionDAOMock = Mockito.mock(ConnectionDAO.class);
       YourClass yourClass = new YourClass(connectionDAOMock);

       //...init the mock here, see the Mockito documentation for that

       String result = yourClass.getProcessNames();


   }

}
也许您需要对
qpObj
执行同样的操作。希望这个基本的想法能对一开始有所帮助