java - 单元测试有问题,怎样才能让它只工作一次?

标签 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次?

最佳答案

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

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

//...

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

//...

上面的代码会让 resultSetMock.next() 在第一次调用时返回 true 让它进入 while 循环,第二次调用将返回 false 以停止。

现在应该在执行测试时提供预期的行为。

关于java - 单元测试有问题,怎样才能让它只工作一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58890055/

相关文章:

python - `tkinter.iconbitmap` 方法返回空字符串

java - 为什么我们要抛出异常并使用junit 4 +mockito断言它抛出异常

java - 如何在 JUnit 和 Mockito 中测试 2 条日志消息

java - 使用 "+"运算符的非字符串操作数后,结果字符串会进入字符串池吗?

java - JAVA 中 C 语言的 logf 相当于什么?

c# - 为什么覆盖 Parallel.foreach 循环的 .NET 单元测试依赖于硬件?

c# - 是否可以使用 SQLite.Net-PCL 创建内存数据库?

java - JApplet显示

Java,维卡 : NaiveBayesUpdateable: Cannot handle numeric class

junit - PowerMock、EasyMock 和 Mockito 框架之间有什么区别?