【问题标题】:jdbcTemplate Mockito unit testingjdbcTemplate Mockito 单元测试
【发布时间】:2019-04-22 00:22:08
【问题描述】:

我正在尝试执行单元测试并为jdbctemplate.query 编写测试。我需要以下方法的代码覆盖率。

代码:

   ` public List<User> UserInfo(final Long runId){
    jdbcTemplate.setFetchSize(10);
    List<User> userList = jdbcTemplate.query(con -> con.prepareStatement(GET_USER_INFO)
            , (rs, rowNum) -> {
                String userName = rs.getString("username");
                String shoppingItems = rs.getString("shopingItems");
                Long shoppingid = rs.getLong("shoppingid");
                User user= new User();
                user.setCmts(userName);
                user.setNodeid(shoppingItems);
                user.setNodename(shoppingid);
                user.setRunId(runId);
                return user;
            });
    return userList;

}`

我已经编写了如下测试,但运行测试“覆盖为 junit”并没有显示 (rs, rowNum) -&gt; { 内的方法的任何代码覆盖率

测试:

`@InjectMocks
private OracleRepository oracleRepository;

@Mock
private JdbcTemplate jdbcTemplate;

@Mock
private ResultSet rs;

@Mock
private Connection connection;

@Mock
private PreparedStatement stmt;

@Mock
private RowMapper rowMapper;

@Test
public void UserInfoTest() throws SQLException {
    String username= "joe";
    String shoppingItems= "3";
    long shoppingId = 1123456778;
    long runId = 2;
    List<User> listUser = new ArrayList<User>();
    Mockito.when(rs.getString("cmts")).thenReturn(cmts);
    Mockito.when(rs.getString("node")).thenReturn(node);
    Mockito.when(rs.getLong("nodeid")).thenReturn(nodeid);
     User user= new User();
     user.setUserName(username);
     user.setShoppingItems(shoppingItems);
     user.setShoppingId(shoppingId);
     user.setRunId(runId);
     listUser.add(user);
    Mockito.when(connection.prepareStatement(Mockito.any(String.class))).thenReturn(stmt);
    Mockito.when(rowMapper.mapRow(Mockito.any(ResultSet.class), Mockito.any(Integer.class))).thenReturn(user);
    Mockito.when(jdbcTemplate.query(Mockito.anyString(), Mockito.any(RowMapper.class))).thenReturn(listUser);
    List<User> list = oracleRepository.UserInfo(runId);
}`

我该如何解决这个问题?

【问题讨论】:

    标签: java unit-testing mockito


    【解决方案1】:

    List&lt;User&gt; 之后的测试底部,您可以添加:

        ArgumentCaptor<RowMapper> argCaptor = ArgumentCaptor.forClass(RowMapper.class);
        Mockito.verify(jdbcTemplate).query(Mockito.any(PreparedStatementCreator.class), argCaptor.capture());
    
        RowMapper<User> rowMapper = argCaptor.getValue();
    
        User userResult = rowMapper.mapRow(rs, -1);
        verify(rs).getString("username");
        verify(rs).getString("shopingItems");
        verify(rs).getLong("shoppingid2");
    
        assertEqual(cmts, userResult.getCmts()); 
    

    这会捕获您定义的功能接口,然后您将其作为操作来测试它。我也检查了验证和断言。但是,如果其他人必须维护此代码库,这并不是最容易理解的。您可能需要考虑创建一个实现接口的类并直接对其进行测试以提高可读性。

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多