使用 JUnit 和 Mockito 对 DAO 类进行单元测试



我有DaoImpl class:

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()因此我的整体单元测试线覆盖率低于要求。我们可以涵盖这部分吗?如果是,那么我们如何做?谢谢。

试试下面的代码。我还将介绍代码。我从我那边检查它,它奏效了。

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));

最新更新