Модульное тестирование Grails 3: как вы выполняете mockFor, createMock и требования в Grails 3?

Я обновляю приложение с Grails 2.4.4 до Grails 3.0.9 и не могу найти информацию о том, как выполнять mockFor, createMock и требования в Grails 3.

Раньше я делал такие вещи:

fooService = mockFor(FooService)
controller.fooService = fooService.createMock()

fooService.demand.barMethod() { a,b ->
}

Но похоже, что mockFor просто исчез, даже из документации. Как это сделать в Grails 3?

ОБНОВЛЕНИЕ:

Я не хочу переписывать тысячи тестов, написанных в стиле Grails 'mockFor', на стиль взаимодействий Spock, поэтому я придумал следующее решение:

  • замените mockFor() новым MockFor()
  • заменить createMock() на proxyInstance()
  • переместите вызовы fooBean.fooService = fooService.proxyInstance() на после требований

Без дальнейших изменений это «просто работает» в Grails 3.


person HypeMK    schedule 24.11.2015    source источник
comment
Ответ будет зависеть от того, какую среду тестирования вы используете, что не указано в вашем вопросе. Вы используете Спока? Юнит? Что-то другое?   -  person Jeff Scott Brown    schedule 25.11.2015
comment
Я использовал шаблон mockFor+createMock+demand от Grails 1.3.7 (стиль GrailsUnitTestCase JUnit) до Grails 2.4.4 (стиль Specification Spock).   -  person HypeMK    schedule 25.11.2015


Ответы (2)


Вы можете использовать Spock по умолчанию:

@TestFor(MyController)
class MyControllerSpec extends Specification {

    void "test if mocking works"() {
        given:
        def fooService = Mock(FooService)
        fooService.barMethod(_, _) >> {a, b ->
            return a - b
        }

        when:
        def result = fooService.barMethod(5, 4)

        then:
        result == 1
    }
}

class FooService {
    int barMethod(int a, int b) {
        return a + b;
    }
}
person jeremija    schedule 24.11.2015
comment
Этого было достаточно, чтобы понять это, большое спасибо. - person HypeMK; 25.11.2015
comment
Ознакомьтесь с решением Groovy, которое я придумал (обновлено в исходном сообщении). - person HypeMK; 26.11.2015
comment
Спасибо за подсказку, может пригодится :) - person jeremija; 26.11.2015

Я также обновлял множество тестов Grails 2, которые использовали mockFor, и использовал аналогичный подход, описанный HypeMK:

  1. добавить импорт для Groovy MockFor: import groovy.mock.interceptor.MockFor
  2. переименовать mockFor в new MockFor
  3. переименовать createMock() в proxyInstance()
  4. удалить звонки на verify()
person Jay P.    schedule 18.11.2016
comment
Ответ отлично работает для тестовых случаев Junit в Grails 3.2.4 - person Shashank.gupta40; 03.02.2017