Get know how to create mocks and spies in even more compact way with Spock 1.1
Spock heavily leverages operator overloading (and Groovy magic) to provide very compact and highly readable specifications (tests) which wouldn’t be able to achieve in Java. This is very clearly visible among others in the whole mocking framework. However, preparing my Spock training I found a place for further improvements in a way how mocks and spies are created.
The Groovy way
Probably the most common way to create mocks (and spies) among devoted Groovy & Grails users is:
def dao = Mock(Dao)
The type inference in IDE works fine (there is type aware code completion). Nonetheless, this syntax is usually less readable for Java newcomers (people using Spock to tests production code written in Java) and in general for people preferring strong typing (including me).
The Java way
The same mock creation in the Java way would look as above:
Dao dao = Mock(Dao)
The first impression about this code snipped is – very verbose. Well, it is a Java way – why should we expect anything more ;).
The shorter Java way
As I already mentioned Spock leverages Groovy magic and the following construction works perfectly fine:
Dao dao = Mock()
Under the hood Spock uses a type used in the left side of an assignment to determine a type for which a mock should be created. Nominally everything is ok. Unfortunately there is one awkward limitation:
IDE complains about unsafe type assignment and without getting deeper into the logic used in Spock it is justified. Luckily the situation is not hopeless.
The shorter Java way – Spock 1.1
Preparing practical exercises for my Spock training some time ago gave me an excuse to get into the details of implementation and after a few minutes I was able to improve the code to make it work cleanly in IDE (after a few years of living with that limitation!).
Dao dao = Mock()
No warning in IDE anymore.
Multiple times in my career I experienced a well known truth that preparing a presentation is very educational also for the presenter. In a case of a new 3-day long training it is even more noticeable – attendees have much more time to ask you uncomfortable question :). Not for the first time my preparations resulted in a new feature or an enhancement in some popular libraries or frameworks.
The last code snippet requires Spock in version 1.1 (which as a time of writing is available as the release candidate 3 – 1.1-rc-3 to not trigger a warning in IDE. There is a lot of new features in Spock 1.1 – why wouldn’t you give it a try? :)
Picture credits: GDJ from openclipart.org