eyalgo
11/15/2014 - 9:57 PM

MockitoExamples.java

package eyalgo;

import static org.hamcrest.Matchers.equalTo;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;

//The RunWith automatically instantiate fields with @Mock annotation
//and injects to the tested class @InjectMocks
@RunWith(MockitoJUnitRunner.class)
public class NameConnectorTest {
	@Mock
	private NameConvention nameConventionAsMockField;
	
	@InjectMocks
	private NameConnector connector;
	
	private NameConvention nameConventionAsMockOther;
	
	@Before
	public void setup() {
		//This is another way to inject mocks (instead of the annotations above)
		MockitoAnnotations.initMocks(this);
		nameConventionAsMockOther = mock(NameConvention.class);
		NameConnector otherConnector = new NameConnector(nameConventionAsMockOther);
	}
	
	@Test
	public void showSomeMockitoExamples() {
		NameConvention nameConventionAsMock = mock(NameConvention.class, "Name for this mock");
		
		// Stub and tell your mock to do something
		when(nameConventionAsMock.bigBangConvention("INPUT")).thenReturn("Some output");
		
		// Throw exception for some input
		when(nameConventionAsMock.bigBangConvention("Other INPUT")).thenThrow(new RuntimeException("oops"));
		
		// Do more complicated stuff in the "when"
		Answer<String> answer = new Answer<String>() {

			@Override
			public String answer(InvocationOnMock invocation) throws Throwable {
				//do something really complicated
				return "some output";
			}
		};
		//Show also hamcrest matchers
		when(nameConventionAsMock.bigBangConvention(argThat(equalTo("my name is Inigo Montoya")))).then(answer);
		
		// Run the test..
		
		//Verify some calls
		verify(nameConventionAsMock).bigBangConvention("INPUT");
		verify(nameConventionAsMock, times(10)).bigBangConvention("wow");
		
		// Verify that the method was never called. With any input
		verify(nameConventionAsMock, never()).bigBangConvention(anyString());
		
		verifyNoMoreInteractions(nameConventionAsMock);
		verifyZeroInteractions(nameConventionAsMockField);
		
		//Check order of calls
		InOrder order = inOrder(nameConventionAsMock, nameConventionAsMockOther);
		order.verify(nameConventionAsMock).bigBangConvention("INPUT");
		order.verify(nameConventionAsMock).bigBangConvention("other INPUT");
		
	}
}