2016-11-26 8 views
0

В моих модульных тестах у меня есть 2 объекта Mock, назовем их Book book и Shelf shelf. Я хочу убедиться, что метод repair(), если book вызывается первым фрагментом кода, который я тестирую, прежде чем он будет возвращен в shelf с помощью метода putBack(Book) класса Shelf.Как проверить метод, вызванный в правильном порядке среди макетных объектов в Spock?

Вот быстрые иллюстрации:

def "Organize damaged books"() { 

    given: 
    Book book = Mock(Book) 
    Shelf shelf = Mock(Shelf) 

    when: 
    library.returnDamaged(book) 

    then: 
    1 * book.repair() 
    1 * shelf.putBack(book) 

} 

Испытание выше будет проходить, даже если в методе returnDamaged, я называю shelf.putBack() первую перед book.repair(). Я пробовал:

1 * shelf.putBack(book) >> { 
    1 * book.repair() 
} 

Но тест все еще проходит независимо от того, что на первом месте.

+0

Вы уверены, что 'shelf.putBack()' бросает исключение когда книга не была отремонтирована? –

+0

Для полки не нужно делать это. –

ответ

2

Из документации Спока на Interaction Based Testing:

Чтобы избежать чрезмерной спецификации, Спок по умолчанию позволяет любой заказ вызова, при условии, что указанные взаимодействия в конечном счете удовлетворены ... в тех случаях, когда порядок имеет значение вызова, вы можете наложить порядок путем разделения взаимодействий на несколько блоков then:.

Так что, если вы хотите, чтобы навести порядок вызова, все, что вам нужно сделать, это разделить утверждение на несколько блоков: then

then: 
1 * book.repair() 

then: 
1 * shelf.putBack(book)