Mockito is one of the
leading mocking framework. It provides us functionality to create stubs and
verify the invocation count of any specific method during any specific action.
Mocking is preferred during unit testing, when we either do
not have real objects available for testing or want to focus on testing our
newly created functionality without worrying about dependency instantiation.
We need to use below maven dependency to include
mockito in our project -
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.5</version>
</dependency>
To see the way to use
mockito, we will take a real life scenario, where we have trade interface and a
validation class which has utility methods to validate the trade. In this
example we want to test that validation method isTradeValid() is working as expected.
We will perform below steps to test it -
1.
Create a mock stub of Trade interface using
mockito2. Specify what the stub should return if any specific function is called.
3. Call the method under test ,which is isTradeValid() and assert to validate the result
4. verify that during execution of method under test, which is isTradeValid() , other methods are called only specific number of times.
The sample code is as mentioned below -
Trade.java
package mockito;
public interface Trade {
public String getPrincipal();
public String getCounterparty();
public Integer getNotional();
}
Validation.java
package mockito;
public class Validation {
public boolean isTradeValid(Trade trade) {
return trade.getNotional() > 0 && trade.getPrincipal() != null
&& trade.getCounterparty() != null;
}
}
ValidateionTest.java
package mockito;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import junit.framework.TestCase;
public class ValidateionTest extends TestCase {
@Mock
private Trade trade;
private Validation validation;
@Override
protected void setUp() throws Exception {
super.setUp();
MockitoAnnotations.initMocks(this);
validation = new Validation();
}
public void testValidTrade() {
Mockito.when(trade.getPrincipal()).thenReturn("JP Morgan");
Mockito.when(trade.getCounterparty()).thenReturn("Morgan Stanly");
Mockito.when(trade.getNotional()).thenReturn(1000);
assertTrue(validation.isTradeValid(trade));
Mockito.verify(trade, Mockito.times(1)).getPrincipal();
Mockito.verify(trade, Mockito.times(1)).getCounterparty();
Mockito.verify(trade, Mockito.times(1)).getNotional();
}
public void testInvalidTradeWithoutCounterparty() {
Mockito.when(trade.getPrincipal()).thenReturn("JP Morgan");
Mockito.when(trade.getCounterparty()).thenReturn(null);
Mockito.when(trade.getNotional()).thenReturn(1000);
assertFalse(validation.isTradeValid(trade));
Mockito.verify(trade, Mockito.times(1)).getPrincipal();
Mockito.verify(trade, Mockito.times(1)).getCounterparty();
Mockito.verify(trade, Mockito.times(1)).getNotional();
}
}
Description and use of mock API used in ValidateionTest is as mentioned below -
2. MockitoAnnotations.initMocks(this); is used to ask the class to process and initialize the references, associated with @mock, with corresponding stubs.
3. Mockito.when(trade.getPrincipal()).thenReturn("JP Morgan"); is used to specify what value should the stub return on invocation of specific function.
4. Mockito.verify(trade, Mockito.times(1)).getPrincipal(); is used to verify the number of invocation of specific fucntion.
This
project can be downloaded from here
References - http://salilstock.blogspot.in/2011/04/creating-mock-objects-for-test-driven.html
References - http://salilstock.blogspot.in/2011/04/creating-mock-objects-for-test-driven.html