lambda 表达式中的模拟方法不起作用

问题描述 投票:0回答:1

我正在使用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上的调用吗

java lambda mockito functional-interface
1个回答
0
投票

事实上,在测试

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));
© www.soinside.com 2019 - 2024. All rights reserved.