当前位置: 首页 > 知识库问答 >
问题:

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

皮景龙
2023-03-14

我有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()方法没有被覆盖,因此我的整体单元测试行覆盖率低于要求。我们能涵盖那部分吗?如果是,我们怎么做?谢了。

共有1个答案

杜志
2023-03-14

尝试下面的代码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));
 类似资料:
  • 问题内容: 我有几个DAO对象,这些对象用于从数据库中检索信息,我 确实 想为它们编写一些自动化测试,但是我很难弄清楚该怎么做。 我正在使用Spring 来运行实际查询(通过准备好的语句)并将结果映射到模型对象(通过类)。 如果要编写单元测试,则不确定如何/应该模拟对象。例如,由于只有读操作,因此我将使用实际的数据库连接,而不模拟jdbcTemplate,但我不确定那是正确的。 这是批处理中最简单

  • 我有这个过滤器类,在使用junit进行测试时需要尽可能高的代码覆盖率。 和测试等级: 当我运行时,它在 线 我如何避免这种情况? 我需要调用这个方法并执行里面的任何内容来提供所需的代码覆盖。

  • 我有这样一个简单的课程: 我想为它写一个测试,下面是一个框架: ErrorLogger类中的logger是由StaticLoggerBinder提供的,所以我的问题是-如何让它工作,以便那些检查“1*logger.error(u作为字符串)”可以工作?在ErrorLogger类中,我找不到一种恰当的方式来嘲笑那个记录器。我曾考虑过反射,并以某种方式访问它,此外,mockito注入也有一个想法(但如

  • 我是TDD的忠实粉丝,我通常在编写代码之前为我的大学作业编写测试用例。下面是我作业的界面:

  • 最近,我尝试为akka参与者编写一些单元测试,以测试参与者消息流。我在测试中观察到一些奇怪的行为: 下一个 在我的代码中,我有: 基本上,有时(很少)这样的测试失败(在另一个操作系统上),并且抛出processMessage方法的异常(由于业务逻辑导致的IllegalStateException)。

  • 问题内容: 有人可以帮我这个忙。我正在使用Jersey休息测试框架版本2.21(在Grizzly容器上)编写Rest资源的单元测试。 当我调试测试类时,看到myManager的模拟对象。但是,当调试进入“ MyResouce类”时,myManager对象将变为null并得到NullPointer异常。 尝试过其他人提供的解决方案,但是没有运气。请有人帮我。我将近三天就遇到这个问题。:( 我的资源类