【问题标题】:How to cover all the below lines in Junit/Mockito如何在 Junit/Mockito 中覆盖以下所有行
【发布时间】:2018-07-06 12:21:10
【问题描述】:

我尝试模拟 JdbcTemplate jdbcTemplate ,但这并没有涵盖里面的任何内容

新员工(.......);

请告诉我有没有办法覆盖 new Employee(...) 中的这些行?

public List<Employee> findByCustIdAndType(long Id, String type) 
    {
        return jdbcTemplate.query(SQL.getEmployee(Id, type),
                (rs, rowNum) -> new Employee(rs.getLong("CUSTOMER_ID"), 
                                             rs.getLong("ANCHOR_CUSTOMER_ID") ,
                                             rs.getString("SEGMENT"), 
                                             rs.getDate("END_TS")));
    }

【问题讨论】:

    标签: java spring-boot mockito code-coverage junit4


    【解决方案1】:

    尝试使用 Mockito 捕获 lambda,即 RowMapper&lt;Employee&gt;。然后使用模拟ResultSet 调用它以返回预期值,以便可以断言返回的Employee。这是一个例子:

    @RunWith(MockitoJUnitRunner.class)
    public class EmployeeDAOTest {
        private static final long CUSTOMER_ID = 1;
        private static final long ANCHOR_CUSTOMER_ID = 2;
        private static final String SEGMENT = "A";
        private static final Date END_TS = Date.valueOf(LocalDate.now());
    
        @InjectMocks
        private EmployeeDAO dao;
    
        @Mock   
        private JdbcTemplate jdbcTemplate;
    
        @Mock   
        private ResultSet resultSet;
    
        @Captor
        private ArgumentCaptor<RowMapper<Employee>> rowMapperCaptor;
    
        @Before
        public void prepareTest() throws SQLException {
            when(resultSet.getLong("CUSTOMER_ID")).thenReturn(CUSTOMER_ID);
            when(resultSet.getLong("ANCHOR_CUSTOMER_ID")).thenReturn(ANCHOR_CUSTOMER_ID);
            when(resultSet.getString("SEGMENT")).thenReturn(SEGMENT);
            when(resultSet.getDate("END_TS")).thenReturn(END_TS);
        }
    
        @Test
        public void test() throws SQLException {
            dao.findByCustIdAndType(0, null);
    
            verify(jdbcTemplate).query(anyString(), rowMapperCaptor.capture());
            RowMapper<Employee> rowMapper = rowMapperCaptor.getValue();
            Employee employee = rowMapper.mapRow(resultSet, 1);
            assertEquals(CUSTOMER_ID, employee.getCustomerId());
            assertEquals(ANCHOR_CUSTOMER_ID, employee.getAnchorCustomerId());
            assertEquals(SEGMENT, employee.getSegment());
            assertEquals(END_TS, employee.getEndTs());
        }
    
    }
    

    【讨论】:

    • 谢谢!!!完美的。您能否解释一下这是如何工作的,就像在什么之后被调用的那样清楚。还有俘虏是如何工作的?
    • 不确定你的意思,只是添加断点以查看调用顺序。 Captor 允许捕获注入模拟的方法的参数 - 在本例中是由 lambda 定义的 RowMapper。调用 verify() 时会填充捕获器。之后,可以根据需要访问和使用捕获的参数。在这种情况下,它是一个 RowMapper,因此它的 mapRow() 方法被调用,以便可以断言结果(Employee)。谷歌教程和示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多