Introduction
To create effective unit test, they should be fast. But also you might need to mock object out to be able to write unit tests. The most common library to use for mocking is mockito.
Example: Mock expected results
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
...
@Test
public void testIterator() throws Exception {
Iterator mock = mock(Iterator.class);
when(mock.next()).thenReturn("Hello").thenReturn("World");
assertThat("Hello World", is(equalTo(mock.next() + " " + mock.next())));
}
Example: Mock expected result with input
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
...
@Test
public void testArrayList() throws Exception {
ArrayList mock = mock(ArrayList.class);
when(mock.get(1)).thenReturn("Foo");
assertThat("Foo", is(equalTo(mock.get(1))));
}
Example: Mock expected results with any input
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
...
@Test
public void testArrayListAny() throws Exception {
ArrayList mock = mock(ArrayList.class);
when(mock.get(anyInt())).thenReturn("Foo");
assertThat("Foo", is(equalTo(mock.get(1))));
}
Example: Mock and expect exception
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
...
@Test(expected = IOException.class)
public void testOutputStream() throws Exception {
OutputStream mock = mock(OutputStream.class);
doThrow(new IOException()).when(mock).close();
mock.close();
}
Example: Mock and verify that metods were invoked
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
...
@Test
public void testOutputStreamVerify() throws Exception {
OutputStream mock = mock(OutputStream.class);
BufferedOutputStream fos = new BufferedOutputStream(mock);
fos.close();
verify(mock).close();
}