Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Verify Spock mock with specified timeout

In Mockito there is option to verify if mock method has been called, and specify timeout for this verification (VerificationWithTimeout), for example:

verify(mock, timeout(200).atLeastOnce()).baz();

It there any equivalent to such functionality in Spock?

like image 997
Jakub Kubrynski Avatar asked Feb 10 '14 00:02

Jakub Kubrynski


3 Answers

Using PollingConditions and a boolean variable, the following example evaluates a function until it satisfies an interaction.

def "test the config watcher to reload games if a new customer directory is added"() {

given:
def conditions = new PollingConditions(initialDelay: 1, timeout: 60, factor: 1.25)
def mockGameConfigLoader = Mock(GameConfigLoader)
def gameConfigWatcher= new GameConfigWatcher(mockGameConfigLoader)
boolean gamesReloaded = false

when:
conditions.eventually {
    gameConfigWatcher.listenEvents()
    assert gamesReloaded
}

then:
1 * mockGameConfigLoader.loadAllGameConfigs() >> {
    gamesReloaded = true
}
0 * _

}

like image 142
happysathya Avatar answered Oct 05 '22 00:10

happysathya


I was trying to use PollingConditions to satisfy a similar scenario (which wasn't helpful), but instead found satisfaction in Spock's BlockingVariables. To verify that SomeService.method() is invoked at least once in function ClassBeingTested.method() within a given timeout period:

def "verify an interaction happened at least once within 200ms"(){
    given:
        def result = new BlockingVariable<Boolean>(0.2) // 200ms
        SomeService someServiceMock = Mock()
        someServiceMock.method() >> {
            result.set(true)
        }
        ClassBeingTested clazz = new ClassBeingTested(someService: someServiceMock)
    when:
        clazz.someMethod()
    then:
        result.get()
}

When the result is set, the blocking condition will be satisfied and result.get() would have to return true for the condition to pass. If it fails to be set within 200ms, the test will fail with a timeout exception.

like image 11
th3morg Avatar answered Nov 15 '22 03:11

th3morg


There is no equivalent in Spock. (PollingConditions can only be used for conditions, not for interactions.) The closest you can get is to add a sleep() statement in the then block:

when:
...

then:
sleep(200)
(1.._) * mock.baz()
like image 7
Peter Niederwieser Avatar answered Nov 15 '22 02:11

Peter Niederwieser