Groovy MockFor - как обрабатывать вызовы "с" методами на макетах - PullRequest
0 голосов
/ 02 октября 2010

Я столкнулся с интересной проблемой при использовании поддержки макетов в Groovy для тестирования совместной работы с зависимостями.У нас есть два класса (пример):

class Dependency {

    void method() {
        throw new OperationNotSupportedException()
    }
}

class Dependent {

    Dependency dependency

    void useDependency() {
        dependency.with {  method() }
    }
}

Обратите внимание на то, как вызывается метод () для зависимости - это делается внутри метода зависимости "with".

Мне нужнофиктивный вызов метода () в тесте, поэтому моей первой попыткой было сделать что-то вроде этого:

class IgnoringWithTest {

    @Test
    void testWithMock() {
        def depMock = new MockFor(Dependency)
        Dependent dep = new Dependent()
        depMock.demand.method { }
        dep.dependency = depMock.proxyInstance()

        dep.useDependency()

        depMock.verify dep.dependency
    }
}

К сожалению, этот «наивный» подход приводит к появлению сообщения об ошибке во время выполнения теста «Не ожидается вызова с помощьюэтот момент. Тем не менее 1 вызов (ы) для «метода» ожидается ".Это нормально, так как мы действительно пытаемся вызвать метод () для зависимости здесь.

Я попытался игнорировать вызов метода with (), добавив следующую строку:

depMock.ignore('with')

После этого я не получал жалоб на вызовы метода with (), однако оказалось, что ожиданиеЗаявленное использование спроса было проигнорировано.В результате я получил OperationNotSupportedException.

И теперь возникает вопрос - как сделать mock для метода () без проблем, когда в реализации он будет вызван в замыкании, переданном with ()?

1 Ответ

0 голосов
/ 04 октября 2010

Я думаю, что это ошибка в MockFor, но есть простой обходной путь: заключите использование макета в блок depMock.use следующим образом:

import groovy.util.GroovyTestCase
import groovy.mock.interceptor.MockFor

class IgnoringWithTest extends GroovyTestCase {

    void testWithMock() {
        def depMock = new MockFor(Dependency)
        Dependent dep = new Dependent()
        depMock.ignore('with')
        depMock.demand.method { }
        dep.dependency = depMock.proxyInstance()

        depMock.use {
            dep.useDependency()
        }
    }
}
...