Spocklight: Change Return Value of Mocked or Stubbed Service Based On Argument Value
Join the DZone community and get the full member experience.
Join For FreeMy colleague Albert van Veen wrote a blog post about Using ArgumentMatchers with Mockito. The idea is to let a mocked or stubbed service return a different value based on the argument passed into the service. This is inspired me to write the same sample with Spock.
Spock
already has built-in mock and stub support, so first of all we don’t
need an extra library to support mocking and stubbing. We can easily
create a mock or stub with the Mock()
and Stub()
methods. We will see usage of both in the following examples.
In the first example we simply return true or false for ChocolateService.doesCustomerLikesChocolate()
in the separate test methods.
import spock.lang.* public class CandyServiceSpecification extends Specification { private ChocolateService chocolateService = Mock() private CandyService candyService = new CandyServiceImpl() def setup() { candyService.chocolateService = chocolateService } def "Customer Albert really likes chocolate"() { given: final Customer customer = new Customer(firstName: 'Albert') and: 'Mock returns true' 1 * chocolateService.doesCustomerLikesChocolate(customer) >> true expect: 'Albert likes chocolate' candyService.getCandiesLikeByCustomer(customer).contains Candy.CHOCOLATE } def "Other customer do not like chocolate"() { given: final Customer customer = new Customer(firstName: 'Any other firstname') and: 'Mock returns false' 1 * chocolateService.doesCustomerLikesChocolate(customer) >> false expect: 'Customer does not like chocolate' !candyService.getCandiesLikeByCustomer(customer).contains(Candy.CHOCOLATE) } }
In the following example we mimic the ArgumentMatcher and this time we use a stub instead of mock.
import spock.lang.* public class CandyServiceSpecification extends Specification { private CandyService candyService = new CandyServiceImpl() def setup() { candyService.chocolateService = Stub(ChocolateService) { getCandiesLikeByCustomer(_) >> { Customer customer -> customer?.firstName == 'Albert' } } } def "Customer Albert really likes chocolate"() { given: final Customer customer = new Customer(firstName: 'Albert') expect: 'Albert likes chocolate' candyService.getCandiesLikeByCustomer(customer).contains Candy.CHOCOLATE } def "Other customer do not like chocolate"() { given: final Customer customer = new Customer(firstName: 'Any other firstname') expect: 'Customer does not like chocolate' !candyService.getCandiesLikeByCustomer(customer).contains(Candy.CHOCOLATE) } }
Code written with Spock 0.7-groovy-2.0
Published at DZone with permission of Hubert Klein Ikkink, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Trending
-
Auto-Scaling Kinesis Data Streams Applications on Kubernetes
-
Micro Frontends on Monorepo With Remote State Management
-
Web Development Checklist
-
Cypress Tutorial: A Comprehensive Guide With Examples and Best Practices
Comments