Creating Tests for LCD Numbers Kata by Mocking Collaborators
For other languages see
Requirements (copied from Ruby Quiz)
LcdDisplay creates an LCD string representation of an integer value using a
4x7 grid of space each, using minus and pipe characters for each digit.
Each digit is shown below:
-- -- -- -- -- -- -- -- | | | | || || | || || | | | | | || || | || || | -- -- -- -- -- -- -- | | || | | || | || | | | | || | | || | || | | -- -- -- -- -- -- --
The bar size should be adjustable. The default value is 2 - as shown above. Read more about it at RubyQuiz.
Description of Existing Solution
To make things easier for you, here is the description of the solution used in the code:
LcdDisplay is the entry point. The given number is split into digits according to the
NumeralSystem (which is the Decimal System in our case). Then the initial
created by copying the template
Patterns. Then the (LCD) digits are scaled
DigitScaler according to the
Scaling value. The actual scaling is done inside
ScalingRepeater by repeating certain rows and columns of the template. Finally
the list of digits is combined to a single String by the
There is a class
Main to see the LCD Numbers working. There you can see how all the
classes are assembled and collaborators are combined with each other.
You can run the
java org.codecop.lcdnumbers.Main <number, e.g. 123> <size, e.g. 2>
Creating Unit Tests
Create unit tests for all classes. Make sure all units are tested in isolation.
The point of this exercise is to go extreme to practise using test doubles.
Create test doubles for everything! Create dummy objects for all used values
and stub all collaborators, even the most simple classes like
- Start testing the simple units like
Digit. These units have a single (interesting) method with a single collaborator.
- Work on
DigitPrinter. Both have more logic, but still only a single collaborator.
- Things are getting more complicated with
- Finally go for
LcdDisplaywhich has three collaborators.
There are sample LCD outputs in the
src/test/resources folder to be used in tests.
size_3 folders contain each digit in original size and
scaled twice and three times.
Check your Coverage
To measure your progress you should use code coverage tools:
EclEmma inside of Eclipse.
Cobertura - type
mvnw cobertura:coberturaor run
PIT - type
mvnw test-compile org pitest:pitest-maven:mutationCoverageor run
./pit.sh. Note that PIT does not work if there are any blanks in the path names leading to the current location.
Enforcing all calls to other classes in a test is not recommended in real unit tests because this leads to bad tests which are bound to the implementation. These over specified tests make it impossible to change the code under test without breaking. We want to be able to change the code without breaking the test as long as the required functionality is not changed. This exercise is for practising test doubles.
This work is licensed under a New BSD License, see
license txt in repository.
Thanks to Ilke Zilci for trying out this exercise.