Как мне проверить DAO, используя Mockito? - PullRequest
0 голосов
/ 01 июля 2019

Я новичок в модульном тестировании и пытаюсь написать несколько тестов для моих DAO.Я следовал некоторым учебникам / ответам здесь, но большинство из них не относятся к моим DAO.

Я получаю это предупреждение при запуске теста org.mockito.exceptions.verification.WantedButNotInvoked: Требуется, но не вызывается: mockConn.prepareStatement ();

Что не так?

private ApprovalConditionDAO approvalConditionDAO;
@Mock
DataSource mockDataSource;
@Mock
Connection mockConn;
@Mock
PreparedStatement mockPreparedStmnt;
@Mock
CallableStatement cs;
@Mock
ResultSet mockResultSet;

@Before
public void setUp() throws SQLException {
    approvalConditionDAO = new ApprovalConditionDAO();
    when(mockDataSource.getConnection()).thenReturn(mockConn);
    when(mockDataSource.getConnection(anyString(),
                                      anyString())).thenReturn(mockConn);
    when(mockConn.prepareStatement(anyString(),
                                   anyInt())).thenReturn(mockPreparedStmnt);
    doNothing().when(mockConn).commit();
    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);
}

@Test
public void testCreateWithNoExceptions() throws SQLException {    
   ArrayList<ApprovalConditionBean> actualValues = approvalConditionDAO.getAllApprovalCondition();

    //verify and assert
    verify(mockConn, times(1)).prepareStatement(anyString());
    verify(mockPreparedStmnt, times(1)).execute();
    verify(mockConn, times(1)).commit();
    verify(mockResultSet, times(2)).next();
    verify(mockResultSet, times(1)).getString("ID");
    verify(mockResultSet, times(1)).getString("EIT_CODE");
    verify(mockResultSet, times(1)).getString("FRIST_KEY_TYPE");
    verify(mockResultSet, times(1)).getString("FRIST_KEY_VALUE");
    verify(mockResultSet, times(1)).getString("FRIST_EIT_SEGMENT");
    verify(mockResultSet, times(1)).getString("OPERATION");
    verify(mockResultSet, times(1)).getString("SECOND_KEY_TYPE");
    verify(mockResultSet, times(1)).getString("SECOND_KEY_VALUE");
    verify(mockResultSet, times(1)).getString("SECOND_EIT_SEGMENT");
    verify(mockResultSet, times(1)).getString("APPROVAL_CODE");
}

И это Дао, которое я хочу проверить.

  public class ApprovalConditionDAO extends AppsproConnection {
Connection connection;
PreparedStatement ps;
CallableStatement cs;
ResultSet rs;
RestHelper rh = new RestHelper();


public ArrayList<ApprovalConditionBean> getAllApprovalCondition() {

 ArrayList<ApprovalConditionBean> approvalConditionList =
     new ArrayList<ApprovalConditionBean>();
 try {
     connection = AppsproConnection.getConnection();
     String query =
         "SELECT * FROM "+" "+getSchema_Name()+".XXX_APPROVAL_CONDITION";
     ps = connection.prepareStatement(query);
     rs = ps.executeQuery();
     while (rs.next()) {
         ApprovalConditionBean approvalConditionBean = new ApprovalConditionBean();
         approvalConditionBean.setId(rs.getString("ID"));
         approvalConditionBean.setEitCode(rs.getString("EIT_CODE"));
         approvalConditionBean.setFirstKeyType(rs.getString("FRIST_KEY_TYPE"));
         approvalConditionBean.setFirstKeyValue(rs.getString("FRIST_KEY_VALUE"));
         approvalConditionBean.setFirstEitSegment(rs.getString("FRIST_EIT_SEGMENT"));
         approvalConditionBean.setOperation(rs.getString("OPERATION"));
         approvalConditionBean.setSecondKeyType(rs.getString("SECOND_KEY_TYPE"));
         approvalConditionBean.setSecondKeyValue(rs.getString("SECOND_KEY_VALUE"));
         approvalConditionBean.setSecondEitSegment(rs.getString("SECOND_EIT_SEGMENT"));
         approvalConditionBean.setApprovalCode(rs.getString("APPROVAL_CODE"));


         approvalConditionList.add(approvalConditionBean);

     }

 } catch (Exception e) {
     //("Error: ");
     e.printStackTrace();
 } finally {
     closeResources(connection, ps, rs);
 }
 return approvalConditionList;

}

И это какМой AppsproConnection Calss

     public static Connection getConnection(boolean commit) {
    if (CommonConfigReader.getValue("CONNECTION_TYPE").equalsIgnoreCase("JDBC")) {
        return getJDBCConnection(commit);
    } else {
        return getDSConnection(commit);
    }
}

public static Connection getConnection() {
    if (CommonConfigReader.getValue("CONNECTION_TYPE").equalsIgnoreCase("JDBC")) {
        return getJDBCConnection();
    } else {
        return getDSConnection();
    }
}

1 Ответ

1 голос
/ 01 июля 2019

Вы не вызывали метод, который хотели проверить, из метода test.
У вас нет события для этого.

class TestClass {
    private MyDao underTest;

    @Before
    public void setUp() throws SQLException {
        underTest = new MyDao();
        // mocking things...
    }
}

И используя этот тестовый объект, вы должны вызвать метод, который вы действительно хотите проверить из тестового метода.

@Test
public void testCreateWithNoExceptions() throws SQLException {
    // ...

    ArrayList<ApprovalConditionBean> actualValues = underTest.getAllApprovalCondition();

    // assertions
}

Если вы не можете манипулировать тем, как вы получаете соединение от статического класса, тогда вы можете реорганизовать свой метод, чтобы получить соединение от другого метода в том же классе.

public ArrayList<ApprovalConditionBean> getAllApprovalCondition() {
    // ...
    connection = getConnection();
    // ...
}

Connection getConnection() {
    return AppsproConnection.getConnection();
}

Если вы используете подобное, вы можете создать экземпляр тестового объекта таким образом, чтобы вы могли управлять типом соединения, возвращаемого для тестов.

@Before
public void setUp() throws SQLException {
    when(mockConn.prepareStatement(anyString(), anyInt())).thenReturn(mockPreparedStmnt);
    doNothing().when(mockConn).commit();
    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);

    underTest = new MyDao(){
        @Override
        public Connection getConnection() {
            return mockConn;
        }
    };
}

Мы возвращаем проверенное соединение с getConnection. Этот метод вызывается из метода getAllApprovalCondition. В производстве он все еще обеспечивает соединение через AppsproConnection.

...