我正在使用mockito,但是
connection.prepareStatement
没有匹配,我得到了空作为PreparedStatement
。我已经检查过连接是否被正确嘲笑
void myMethod(){
getJdbcTemplate().update(connection -> {
PreparedStatement ps = connection.prepareStatement(addEmailData, new String[] { "mail_id" });
ps.setString(++i, mailBean.getFromEmailId());
return ps;
}, keyHolder);
}
下面是编写的测试用例
void test(){
when(connection.prepareStatement(anyString(),any(String[].class))).thenReturn(mock(PreparedStatement.class));
when(dataSource.getConnection()).thenReturn(connection);
myClass.init(dataSource);
// Act
myClass.myMethod();
}
有人可以建议如何返回
prepareStatement
以便可以测试PS上的调用吗
事实上,在测试
myMethod()
方法时,你必须测试 PreparedStatementCreator
接口实现,它是在调用 connection -> { ... }
方法时由 JdbcTemplate.update()
lambda 表达式创建的。为此,您必须捕获调用此方法的参数,以便您可以使用模拟 Connection
实现来调用它。
例如,你可以这样做。
创建
Connection
、JdbcTemplate
和 PreparedStatement
接口的模拟实现。
Connection connection = Mockito.mock(Connection.class);
JdbcTemplate jdbcTemplate = Mockito.mock(JdbcTemplate.class);
PreparedStatement preparedStatement = Mockito.mock(PreparedStatement.class);
为在您的方法中创建的
PreparedStatementCreator
实现创建一个捕获器。
ArgumentCaptor<PreparedStatementCreator> preparedStatementCreatorCaptor = ArgumentCaptor.forClass(PreparedStatementCreator.class);
定义调用
Connection
方法时模拟 Connection.prepareStatement()
实现的行为。
Mockito.when(connection.prepareStatement(Mockito.anyString(), Mockito.any(String[].class))).thenReturn(preparedStatement);
使用模拟 JdbcTemplate 实现执行您的方法。
MyClass myClass = new MyClass(jdbcTemplate);
myClass.myMethod();
确保您的方法调用
JdbcTemplate.update()
并捕获 PreparedStatementCreator
实现。
Mockito.verify(jdbcTemplate).update(preparedStatementCreatorCaptor.capture(), Mockito.any(KeyHolder.class));
确保此
PreparedStatementCreator
实现创建与您的 PreparedStatement
返回的确切 Connection
。
Assertions.assertEquals(preparedStatement, preparedStatementCreatorCaptor.getValue().createPreparedStatement(connection));