Skip to content

Testing

Sherlock provides stubs and mocks for testing purposes. Try it out: SherlockStub, ReactorSherlockStub, DistributedLockMock and ReactorDistributedLockMock.

Creating own stub and mocks

Sherlock API consists mostly of interfaces, so it's easy to create stubs and mocks for your own purposes.

Sample usage in spock tests:

def "should release a lock after operation"() {
  given: "there is a released lock"
    DistributedLockMock lock = DistributedLockMock.alwaysReleasedLock()
  when: "single instance action is executed"
    boolean taskPerformed = singleInstanceAction(lock)
  then: "the task was performed"
    taskPerformed == true
  and: "lock was acquired and released"
    lock.wasAcquiredAndReleased == true
}

def "should not perform single instance action when lock is locked"() {
  given: "there is a lock acquired by other instance"
    DistributedLockMock lock = DistributedLockMock.alwaysAcquiredLock()
  when: "single instance action is executed"
    boolean taskPerformed = singleInstanceAction(lock)
  then: "action did not perform the task"
    taskPerformed == false
  and: "action failed acquiring the lock"
    lock.wasAcquireRejected == true
  and: "action did not release the lock"
    lock.wasReleaseInvoked == false
}

In Memory Connector

The easiest way to setup Sherlock in tests is to use In-Memory Connector. Use stubs when you need more control over the locking mechanism.