首页 > 解决方案 > 使用 JUnit 和 Mockito 对 DAO 类进行单元测试

问题描述

我有 DaoImpl 类:

public class MessageTypeDaoImpl implements MessageTypeDao{

    public int[] createMessageTypes(final List<MessageType> messageTypes){
        String sql = "INSERT INTO MSG_TYPE VALUES(?, ?)";
        return jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                MessageType messageType = messageTypes.get(i);
                ps.setString(1, messageType.getMessageId());
                ps.setString(2, messageType.getMessageName());
            }

            public int getBatchSize(){
                return messageTypes.size();
            }
    });
}

我的测试:

@RunWith(MockitoJUnitRunner.class)
public class MessageTypeDaoImplTest {

@Mock
private JdbcTemplate jdbcTemplate;

@Spy
@InjectMocks
MessageTypeDaoImpl messageTypeDaoImpl;
@Before
public void setUp(){
    MockitoAnnotations.initMocks(this);
}
@Test
public void createMessageTypes() {
    int[] returnCount = new int[1];
    List<MessageType> messageTypeList = new ArrayList<MessageType>();
    messageTypeList.add(getSampleMessageType());
    messageTypeDaoImpl.createMessageTypes(messageTypeList);
    doReturn(returnCount).when(messageTypeDaoImpl).createMessageTypes(messageTypeList);
    assertEquals(returnCount, messageTypeDaoImpl.createMessageTypes(messageTypeList));
}
}

public MessageType getSampleMessageType(){
    return new MessageType("messageTypeId", "messageTypeName");
}

测试成功,但是当我使用覆盖率运行 junit 测试时,它显示public void setValues()方法没有被覆盖,因此我的整体单元测试行覆盖率低于要求。我们可以涵盖那部分吗?如果是,那么我们如何做到这一点?谢谢。

标签: javaunit-testingmockitojunit4dao

解决方案


试试下面的代码spinet。我也会介绍代码。我从头开始检查它,它起作用了。

int[] batchInsert=new int[] {1,2};
        try {

            Mockito.doAnswer(invocationOnMock -> {

                PreparedStatement ps = Mockito.mock(PreparedStatement.class);
                BatchPreparedStatementSetter psr = invocationOnMock.getArgument(1);
                psr.setValues(ps, 1);
                return batchInsert;

            }).when(jdbcTemplate).batchUpdate(anyString(),  Mockito.any(BatchPreparedStatementSetter.class));

推荐阅读