2016-11-26 46 views
0

在我的单元测试中,我有2个Mock对象,我们称它们为Book bookShelf shelf。我想确保repair()的方法,如果book是由我正在测试的那段代码首先调用的,那么它将通过putBack(Book)方法Shelf类放回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

从Spock的文档上Interaction Based Testing

避免过度规范,斯波克默认为允许任何调用顺序,提供指定的相互作用,最终满足......在这些情况下调用顺序的问题,可以并处通过将交互分成多个块来进行的订单。

所以,如果要强制执行调用顺序,所有你需要做的是断言分成多个then块:

then: 
1 * book.repair() 

then: 
1 * shelf.putBack(book) 
相关问题