2016-11-02 1 views
1

Я хочу написать случаи 2 теста для моего класса:Спок: как передать разные экземпляры в where и заставить подсчет ссылок работать?

  1. теста с нормальным вызовом метода

  2. тест с вызовом метода, который бросает RuntimeException

Для этого я создал следующий тест. Но, к сожалению, это не работает: оно заканчивается словами «Слишком мало вызовов», ноль вместо одного.

Почему?

Код:

import spock.lang.Shared 
import spock.lang.Specification 

class SimpleSpockTest extends Specification { 

    interface Simple { 
     void run(); 
    } 

    @Shared 
    Simple good = Mock(Simple) 

    @Shared 
    Simple bad = Mock(Simple) 

    def "test invocations"() { 
     setup: 
     bad.run() >> { throw new RuntimeException() } 
     when: 
     instance.run() 
     then: 
     invocations * instance.run() 
     where: 
     instance | invocations 
     good  | 1 
     bad  | 1 

    } 

} 

PS Кроме того, я хотел бы перейти «общие» экземпляры в креплении «настройки», но я не могу: он не с того, что класс SimpleSpockTest не обладает свойством «хорошо» или "Плохо".

+0

Кажется, что этот тест не имеет смысла вообще. Чего вы пытаетесь достичь? Каков ваш сценарий? – Opal

+0

Opal, это просто упрощенный пример. В реальном тесте я хочу убедиться, что 1) исключения, выполняемые методом run, регистрируются правильно (вот почему мне нужен макет, который генерирует исключения, я могу подсчитать вызовы обработчика исключений) 2) метод run называется правильным числом раз. Этот тест является упрощенным примером, но он не работает. – MiamiBeach

ответ

0

Mock объекты не будут вести себя так, как вы хотите, как @Shared полей. Из документации Спок по адресу Interaction Based Testing:

Взаимодействие всегда привязано к определенному способу. Следовательно, они не могут быть объявлены статическим методом, setupSpec или cleanupSpec. Точно так же ложные объекты не должны храниться в статических или @Shared полях.

Другими словами, вы должны определить mocks внутри самого метода функции.

Вы упомянули, что представленная выше пример упрощен, но если это возможно, вам придется сделать что-то вроде следующего:

def "test invocations"() { 
    setup: 
    Simple good = Mock(Simple) 
    Simple bad = Mock(Simple) 
    bad.run() >> { throw new RuntimeException() } 

    when: 
    good.run() 
    bad.run() 

    then: 
    1 * good.run() 
    1 * bad.run() 
}