单元测试有问题,如何使其只能工作1次?

时间:2019-11-16 11:08:43

标签: java unit-testing mockito

我尝试对此方法进行单元测试:

  @Override
    public Duck getById(Integer id)  {
        try {
            connection = getNewConnection();
        } catch (SQLException e) {
            log.warning("connection error");
        }
        PreparedStatement preparedStatement = getPreparedStatement(SELECT_DUCK_BY_ID);
        Duck duck = new Duck();
        Frog frog = new Frog();
        String temp;
        int tempInt;
        try {
            preparedStatement.setInt(ID, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                duck.id(resultSet.getInt(ID));
                if ((temp = resultSet.getString(NAME)) != null) {
                    duck.name(temp);
                } else {
                    duck.name(DEFAULT);
                }
...........

我的测试:

    @Test
    public void testGetById() throws SQLException {
        Connection connectionMock = Mockito.mock(Connection.class);
        PreparedStatement preparedStatementMock = Mockito.mock(PreparedStatement.class);
        ResultSet resultSetMock = Mockito.mock(ResultSet.class);
        DuckDAO duckDAO = Mockito.spy(DuckDAO.class);
        Mockito.when(duckDAO.getNewConnection()).thenReturn(connectionMock);
        Mockito.when(connectionMock.prepareStatement(DuckDAO.SELECT_DUCK_BY_ID)).thenReturn(preparedStatementMock);
        Mockito.when(preparedStatementMock.executeQuery()).thenReturn(resultSetMock);
//        Mockito.when(resultSetMock.next()).thenReturn(true);
        duckDAO.getById(ID);

        Mockito.verify(resultSetMock, Mockito.times(1)).getInt(DuckDAO.ID);
   }

我已被评论(//)的行将始终为真,并且循环将始终有效。如何使它只能工作1次?

1 个答案:

答案 0 :(得分:1)

resultSetMock.next()方法仍然需要至少执行两次。首先让它进入循环,然后让它打破循环。

设置调用该方法时要返回的连续返回值。

//...

Mockito.when(resultSetMock.next()).thenReturn(true, false);

//...

上面的方法将在第一次调用resultSetMock.next()时返回{em> true ,使其进入while循环,第二次调用时将返回 {{ 1}} 终止。

这现在应该可以在进行测试时提供预期的行为。