<legend id='pmo6B'><style id='pmo6B'><dir id='pmo6B'><q id='pmo6B'></q></dir></style></legend>
        <bdo id='pmo6B'></bdo><ul id='pmo6B'></ul>
      <tfoot id='pmo6B'></tfoot>
      <i id='pmo6B'><tr id='pmo6B'><dt id='pmo6B'><q id='pmo6B'><span id='pmo6B'><b id='pmo6B'><form id='pmo6B'><ins id='pmo6B'></ins><ul id='pmo6B'></ul><sub id='pmo6B'></sub></form><legend id='pmo6B'></legend><bdo id='pmo6B'><pre id='pmo6B'><center id='pmo6B'></center></pre></bdo></b><th id='pmo6B'></th></span></q></dt></tr></i><div id='pmo6B'><tfoot id='pmo6B'></tfoot><dl id='pmo6B'><fieldset id='pmo6B'></fieldset></dl></div>

        <small id='pmo6B'></small><noframes id='pmo6B'>

      1. 如何使用 Mockito 测试 DAO 方法?

        时间:2023-10-01
          <tbody id='ZKO18'></tbody>

          • <bdo id='ZKO18'></bdo><ul id='ZKO18'></ul>

              <tfoot id='ZKO18'></tfoot>

              <legend id='ZKO18'><style id='ZKO18'><dir id='ZKO18'><q id='ZKO18'></q></dir></style></legend>

                  <small id='ZKO18'></small><noframes id='ZKO18'>

                • <i id='ZKO18'><tr id='ZKO18'><dt id='ZKO18'><q id='ZKO18'><span id='ZKO18'><b id='ZKO18'><form id='ZKO18'><ins id='ZKO18'></ins><ul id='ZKO18'></ul><sub id='ZKO18'></sub></form><legend id='ZKO18'></legend><bdo id='ZKO18'><pre id='ZKO18'><center id='ZKO18'></center></pre></bdo></b><th id='ZKO18'></th></span></q></dt></tr></i><div id='ZKO18'><tfoot id='ZKO18'></tfoot><dl id='ZKO18'><fieldset id='ZKO18'></fieldset></dl></div>
                  本文介绍了如何使用 Mockito 测试 DAO 方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我已经开始发现 Mockito 库,但有一个问题我没有找到正确的答案.

                  I've started to discovered Mockito library and there is a question for which I didn't find the proper answer.

                  如果我的 UserDAO 类中有这样的方法,可以将用户保存在数据库中:

                  If I have for example such method in my UserDAO class that saves user in database:

                  public class UserDAO{
                  ...
                   public void create(User user) {
                          Connection connection = null;
                          PreparedStatement pstmt = null;
                          ResultSet generatedKeys = null;
                          try {
                  
                              connection = getConnection();
                              pstmt = connection.prepareStatement(INSERT_USER,
                                      PreparedStatement.RETURN_GENERATED_KEYS);
                              int counter = 1;
                              pstmt.setString(counter++, user.getFirstName());
                              pstmt.setString(counter++, user.getLastName());
                              pstmt.setString(counter++, user.getEmail());
                              pstmt.setString(counter++, user.getPassword());
                              pstmt.setString(counter++, user.getRole());
                              pstmt.setString(counter, user.getLang());
                  
                              pstmt.execute();
                              connection.commit();
                              generatedKeys = pstmt.getGeneratedKeys();
                  
                              if (generatedKeys.next()) {
                                  user.setId(generatedKeys.getInt(Fields.GENERATED_KEY));
                              }
                          } catch (SQLException e) {
                              rollback(connection);
                              LOG.error("Can not create a user", e);
                          } finally {
                              close(connection);
                              close(pstmt);
                              close(generatedKeys);
                          }
                      }
                    ....
                  }
                  

                  我应该如何测试它?

                  如果我想测试一个 DAO 类,那么我需要创建一个 DataSource 模拟、Connection 模拟、ResultSet 模拟等吗?所以不测试数据库本身?

                  If I want to test for example a DAO class then I need to create a DataSource mock, Connection mock, ResultSet mock etc ? And so not to test the database itself ?

                  但是如果我还想测试 dao 和 database 的行为呢?

                  But what if I want to also test the behavior of dao and database ?

                  您能否提供一些可能有用的代码示例、链接并展示最佳方法?

                  Would you please produce some code samples, links that could be helpful and show best approaches of doing it ?

                  推荐答案

                  这是使用 Mockito 测试您的 UserDAO 的良好开端.此代码使用了大量的 Mockito 功能,因此您可以了解如何使用它们.如果您有任何问题,请告诉我.

                  Here is a good start using Mockito to test your UserDAO. This code uses a good amount of the Mockito features, so you can see how to use them. Let me know if you have questions.

                  import java.sql.Connection;
                  import java.sql.PreparedStatement;
                  import java.sql.ResultSet;
                  import java.sql.SQLException;
                  import javax.sql.DataSource;
                  import org.junit.After;
                  import org.junit.AfterClass;
                  import org.junit.Before;
                  import org.junit.BeforeClass;
                  import org.junit.Test;
                  import static org.junit.Assert.*;
                  import org.junit.runner.RunWith;
                  import static org.mockito.Matchers.anyInt;
                  import static org.mockito.Matchers.anyString;
                  import org.mockito.Mock;
                  import static org.mockito.Mockito.doNothing;
                  import static org.mockito.Mockito.times;
                  import static org.mockito.Mockito.verify;
                  import static org.mockito.Mockito.when;
                  import org.mockito.runners.MockitoJUnitRunner;
                  
                  @RunWith(MockitoJUnitRunner.class)
                  public class TestUserDAO {
                  
                      @Mock
                      DataSource mockDataSource;
                      @Mock
                      Connection mockConn;
                      @Mock
                      PreparedStatement mockPreparedStmnt;
                      @Mock
                      ResultSet mockResultSet;
                      int userId = 100;
                  
                      public TestUserDAO() {
                      }
                  
                      @BeforeClass
                      public static void setUpClass() throws Exception {
                      }
                  
                      @AfterClass
                      public static void tearDownClass() {
                      }
                  
                      @Before
                      public void setUp() throws SQLException {
                          when(mockDataSource.getConnection()).thenReturn(mockConn);
                          when(mockDataSource.getConnection(anyString(), anyString())).thenReturn(mockConn);
                          doNothing().when(mockConn).commit();
                          when(mockConn.prepareStatement(anyString(), anyInt())).thenReturn(mockPreparedStmnt);
                          doNothing().when(mockPreparedStmnt).setString(anyInt(), anyString());
                          when(mockPreparedStmnt.execute()).thenReturn(Boolean.TRUE);
                          when(mockPreparedStmnt.getGeneratedKeys()).thenReturn(mockResultSet);
                          when(mockResultSet.next()).thenReturn(Boolean.TRUE, Boolean.FALSE);
                          when(mockResultSet.getInt(Fields.GENERATED_KEYS)).thenReturn(userId);
                      }
                  
                      @After
                      public void tearDown() {
                      }
                  
                      @Test
                      public void testCreateWithNoExceptions() throws SQLException {
                  
                          UserDAO instance = new UserDAO(mockDataSource);
                          instance.create(new User());
                  
                          //verify and assert
                          verify(mockConn, times(1)).prepareStatement(anyString(), anyInt());
                          verify(mockPreparedStmnt, times(6)).setString(anyInt(), anyString());
                          verify(mockPreparedStmnt, times(1)).execute();
                          verify(mockConn, times(1)).commit();
                          verify(mockResultSet, times(2)).next();
                          verify(mockResultSet, times(1)).getInt(Fields.GENERATED_KEYS);
                      }
                  
                      @Test(expected = SQLException.class)
                      public void testCreateWithPreparedStmntException() throws SQLException {
                  
                           //mock
                           when(mockConn.prepareStatement(anyString(), anyInt())).thenThrow(new SQLException());
                  
                  
                          try {
                              UserDAO instance = new UserDAO(mockDataSource);
                              instance.create(new User());
                          } catch (SQLException se) {
                              //verify and assert
                              verify(mockConn, times(1)).prepareStatement(anyString(), anyInt());
                              verify(mockPreparedStmnt, times(0)).setString(anyInt(), anyString());
                              verify(mockPreparedStmnt, times(0)).execute();
                              verify(mockConn, times(0)).commit();
                              verify(mockResultSet, times(0)).next();
                              verify(mockResultSet, times(0)).getInt(Fields.GENERATED_KEYS);
                              throw se;
                          }
                  
                      }
                  }
                  

                  这篇关于如何使用 Mockito 测试 DAO 方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:为什么我无法在使用 Maven 的 Junit 测试运行中访问 下一篇:Mockito 将模拟注入 Spy 对象

                  相关文章

                  最新文章

                  <legend id='qwn7V'><style id='qwn7V'><dir id='qwn7V'><q id='qwn7V'></q></dir></style></legend>
                  <i id='qwn7V'><tr id='qwn7V'><dt id='qwn7V'><q id='qwn7V'><span id='qwn7V'><b id='qwn7V'><form id='qwn7V'><ins id='qwn7V'></ins><ul id='qwn7V'></ul><sub id='qwn7V'></sub></form><legend id='qwn7V'></legend><bdo id='qwn7V'><pre id='qwn7V'><center id='qwn7V'></center></pre></bdo></b><th id='qwn7V'></th></span></q></dt></tr></i><div id='qwn7V'><tfoot id='qwn7V'></tfoot><dl id='qwn7V'><fieldset id='qwn7V'></fieldset></dl></div>
                  • <bdo id='qwn7V'></bdo><ul id='qwn7V'></ul>

                    <small id='qwn7V'></small><noframes id='qwn7V'>

                    <tfoot id='qwn7V'></tfoot>