Спок тестирует ResultSet в Groovy - PullRequest
0 голосов
/ 05 января 2019

Вот что у меня есть:

def "If there are results then return true otherwise return false"() {
    given:
    ResultSet resultSet = Mock()

    expect:
    resultSet.next()
}

Я пытаюсь проверить логический метод checkIfRowExists(int id, int foreignKey) в классе CheckActuateProjectSetServiceImpl. Возвращает true, если строка существует, и false в противном случае.

Как мне решить эту проблему?

public boolean checkIfRowExists(int id, int foreignKey){
    Resultset resultSet = checkIfRowExistsResultSet(id, foreignKey)

    return false;
}

Вышеуказанный метод пока не имеет правильной реализации, потому что я пытаюсь написать тест перед тем, как реализовать решение.

Спасибо

1 Ответ

0 голосов
/ 06 января 2019

Если бы я был на вашем месте, я бы сделал следующие шаги TDD.

  1. Начните с теста только для одного теста:

    def "If there not are results then return false"() {
        given:
        def service = new CheckActuateProjectSetServiceImpl()
    
        expect:
        !service.checkIfRowExists(1, 2)
    }
    
  2. Реализуйте метод для выполнения теста:

    boolean checkIfRowExists(int id, int foreignKey) {
        return false;
    }
    
  3. Добавить новый тест для случая, когда есть какой-либо результат:

    def "If there are results then return true"() {
        given:
        def service = new CheckActuateProjectSetServiceImpl()
    
        expect:
        service.checkIfRowExists(1, 2)
    }
    
  4. Теперь мы вынуждены реализовать наш метод. Метод выполнит запрос к БД и проверит фактический набор результатов на пустоту. Поскольку запрос БД выходит за рамки модульного теста, мы извлекаем его в отдельный метод и позже переопределим в тесте:

    boolean checkIfRowExists(int id, int foreignKey) throws SQLException {
        ResultSet resultSet = getResultSet(id, foreignKey);
        return resultSet.next();
    }
    
    ResultSet getResultSet(int id, int foreignKey) {
        return null; // TODO should be implemented
    }
    
  5. Теперь наш тест не пройден с NullPointerException, потому что getResultSet() возвращает null. Давайте вернем поддельное ResultSet, которое возвращает true на next() вызов:

    def "If there are results then return true"() {
        given:
        ResultSet mockedResultSet = Mock(ResultSet)
        mockedResultSet.next() >> true
    
        def service = new CheckActuateProjectSetServiceImpl() {
            @Override
            def ResultSet getResultSet(int id, int foreignKey) {
                return mockedResultSet;
            }
        }
    
        expect:
        service.checkIfRowExists(1, 2)
    }
    

    Тест теперь зеленый.

  6. Первый тест также должен быть исправлен, макет для возврата false на next() вызов:

    def "If there not are results then return false"() {
        given:
        ResultSet mockedResultSet = Mock(ResultSet)
        mockedResultSet.next() >> false
    
        def service = new CheckActuateProjectSetServiceImpl() {
            @Override
            def ResultSet getResultSet(int id, int foreignKey) {
                return mockedResultSet;
            }
        }
    
        expect:
        !service.checkIfRowExists(1, 2)
    }
    

Надеюсь, это поможет. Эти шаги являются лишь ориентиром для продвижения вперед в стиле TDD. Конечно, ваша реальность отличается и может потребовать чего-то более конкретного, о чем я говорил выше.

...