At some point we’re likely to require a mocking framework for our unit test code. Ofcourse there’s several java based frameworks. In this post I’m going to look into using JMock.
Setting up an example
Let’s start by looking at an interface, my old favourite a Calculator
public interface Calculator { double add(double a, double b); }
Let’s now add some dependencies to the pom.xml
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jmock</groupId> <artifactId>jmock-junit4</artifactId> <version>2.8.4</version> <scope>test</scope> </dependency> </dependencies>
Using JMock
We need to start off by creating a Mockery object. This will be used to create the mocks as well as handle the three A’s, Arrange, Act and Assert. Let’s jump straight in an look at some code…
package com.putridparrot; import org.jmock.Expectations; import org.jmock.Mockery; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; public class CalculatorTest { private Mockery mockery; @Before public void setUp() { mockery = new Mockery(); } @After public void tearDown() { mockery.assertIsSatisfied(); } @Test public void add() { final Calculator calc = mockery.mock(Calculator.class); mockery.checking(new Expectations() { { oneOf(calc).add(2.0, 4.0); will(returnValue(6.0)); } }); double result = calc.add(2, 4); assertEquals(6.0, result, 0); } }
In the code above we’re creating the Mockery in the setup method and the assert in the teardown.
We then use the Mockery to create a mock of the interface Calculator which we would normally pass into some other class to use, but for simplicity I’ve simply demonstrated how we arrange the mock using mockery.checking along with the expectations. Then we act on the mock object by calling the add method which ofcourse will execute our arrange code.
Here’s an example of some code which demonstrates arranging values which will return a different value each time, so we’ll add the following to our Calculator interface
int random();
and now create the following test, which expects random to be called three times and arranges each return accordingly.
@Test public void random() { final Calculator calc = mockery.mock(Calculator.class); mockery.checking(new Expectations() { { exactly(3) .of(calc) .random(); will(onConsecutiveCalls( returnValue(4), returnValue(10), returnValue(42) )); } }); assertEquals(4, calc.random()); assertEquals(10, calc.random()); assertEquals(42, calc.random()); }
Ofcourse there’s plenty more to JMock, but this should get you started.