java - 如何使用 Mockito 测试 DAO?
问题描述
我是单元测试的新手,我正在尝试为我的 DAO 编写一些测试。我在这里遵循了一些教程/答案,但其中大多数不适用于我的 DAO。
当我运行测试 org.mockito.exceptions.verification.WantedButNotInvoked: Wanted but not invoked: 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 课程
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();
}
}
解决方案
您没有从测试方法中调用您想要测试的方法。
您没有测试对象可以这样做。
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
.
推荐阅读
- javascript - Typescript 在 json 中使用枚举
- android - 如何将图像的宽度设置为 imageView android
- node.js - 将 YouTube 共享链接转换为在我的项目中嵌入链接
- c - 为什么 cmov 总是返回 t_val?
- php - 将新列添加到 WooCommerce 管理产品列表,其中包含销售产品的折扣百分比
- xml - 解析 XSD 以获取节点列表
- c# - 创建线程会增加功耗和 CPU 消耗
- spring - 关于春季休息日期
- javascript - Nodejs - 使用 docker rest api 的调用
- c++ - C ++如何阻止随机引擎产生负数?