JUnit:使用 RowCallbackHandler 模拟 jdbcTemplate 的 query() 方法

Gar*_*ead 3 java junit spring mockito spring-boot

我在 Spring Boot(v.2.2.1.RELEASE)应用程序的 Java 类中有以下代码:

@Inject
private JdbcTemplate jdbcTemplate;

@Inject
private MyRowCallbackHandler myRowCallbackHandler;

public void myMethod() {
    jdbcTemplate.query(MY_QUERY, myRowCallbackHandler);
}
Run Code Online (Sandbox Code Playgroud)

JDBC 模板对象是 org.springframework.jdbc.core.JdbcTemplate 的实现,处理程序是 org.springframework.jdbc.core.RowCallbackHandler 的实现。

使用 JUnit 版本 4 和 Mockito,我可以模仿通过查询方法从数据库检索一行或多行,从而调用处理程序的 processRow() 方法吗?

感谢您的任何帮助。

Cha*_*ejo 6

我在自己的代码中遇到了这个问题,我想在这里分享解决方案,尽管它与上面的情况略有不同,因为我也模拟了 jdbcTemplate。

@InjectMocks
private JdbcOperationRepository jdbcOperationRepository;

@Mock
private NamedParameterJdbcTemplate mockJdbcTemplate;

@Test
public void testMyResults() {
  final ResultSet mockResult1 = mock(ResultSet.class);
  when(mockResult1.getString(MY_COLUMN)).thenReturn(value);
  // ... other when statements to mock the returned data

  doAnswer(invocation -> {
      RowCallbackHandler callbackHandler = invocation.getArgument(2);
      callbackHandler.processRow(mockResult1);
      callbackHandler.processRow(mockResult2);
      return null;
  }).when(mockJdbcTemplate).query(any(), any(), any(RowCallbackHandler.class));
}
Run Code Online (Sandbox Code Playgroud)