Использование метода счетчиков споков на макетах композиций? - PullRequest
0 голосов
/ 05 октября 2018

У меня проблема с созданием тестовых данных с помощью спока фреймворка.Чтобы следовать «композиции через наследование», у меня есть класс для создания тестовых данных для моих модульных тестов.В простой форме это выглядит так:

class TestData extends Specification{

    Foo createFoo(){
        GroovyMock(Foo){
            doSomething() >> "MOCKED!"
        }
    }
}

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

def "simple test"(){
    given:
    TestData testData = new TestData()
    Foo foo = testData.createFoo()

    when:
    println foo.doSomething()

    then:
    1 * foo.doSomething()
}

Я знаю, этот тест не имеет смысла.Это просто для иллюстрации поведения.

Я бы ожидал "зеленый результат" этого теста, так как doSomething () был вызван 1 раз.Но результат теста красный:

Too few invocations for:

1 * foo.doSomething()   (0 invocations)
[...]

Когда я издеваюсь над Foo напрямую, все работает отлично:

def "simple test"(){
    given:
    Foo foo = GroovyMock(Foo){
        doSomething() >> "MOCKED!"
    }

    when:
    println foo.doSomething()

    then:
    1 * foo.doSomething()
}

У кого-нибудь есть идеи, как с этим справиться, не выводя мой тестовый класс из TestData?

Кстати.Я использовал заглушку, возвращающую "MOCKED!"чтобы показать, макет работает.Но это не «перезаписано» или как там это называется, когда testData создал макет.

1 Ответ

0 голосов
/ 05 октября 2018

Взаимодействия Mocks должны быть определены внутри Specification, который их использует.Импорт макетов из других источников, таких как

TestData testData = new TestData()
Foo foo = testData.createFoo()

, не поддерживается.

Хотя возможно создать макеты вне Specification и присоединить их позже, определить их невозможновзаимодействия за пределами Specification.

...