【问题标题】:JUnit: mocking jdbcTemplate's query() method with a RowCallbackHandlerJUnit:使用 RowCallbackHandler 模拟 jdbcTemplate 的 query() 方法
【发布时间】:2020-08-20 19:36:54
【问题描述】:

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

@Inject
private JdbcTemplate jdbcTemplate;

@Inject
private MyRowCallbackHandler myRowCallbackHandler;

public void myMethod() {
    jdbcTemplate.query(MY_QUERY, myRowCallbackHandler);
}

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

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

感谢您的帮助。

【问题讨论】:

  • 你有没有想过这个问题?我遇到了同样的问题。
  • @ChantellOsejo:现在已经有一段时间了,但我想我没有。我所能测试的只是 RowCallbackHandler 本身的工作原理。
  • 我最终确实想出了一些东西,将其作为答案发布在这里,也许对其他人有帮助(即使它不是与您尝试做的事情的 1:1 映射,我相信我的答案可以稍微调整一下以完成您在这里尝试做的事情)。

标签: java spring spring-boot junit mockito


【解决方案1】:

我在自己的代码中遇到了这个问题,我想在这里分享解决方案,尽管它与上面的情况略有不同,因为我也模拟了 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));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多