Using Mockito
This work by Fredrik Wendt is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License http://creativecommons.org/licenses/by-nc-sa/3.0/
Outline • mock(ClassToMock.class) • when(methodCall) ● thenReturn(value) ● thenThrow(Throwable) • verify(mock).method(args) • @Mock • initMocks(this) • assertThat(obj, matcher) • Eclipse IDE tips
Why Mockito - and when? Use Mockito to get ”smart” fake implementations of classes or interfaces out of your reach.
Classical 3A Test @Test public void test() throws Exception { // Arrange // Act // Assert }
Classical 3A Test @Test public void test() throws Exception { // Arrange UnitToTest testee = new UnitToTest(); Helper helper = new Helper(); // Act testee.doSomething(helper); // Assert assertTrue(helper.somethingHappened()); }
Mockito ”Template” Usage @Test public void test() throws Exception { // Arrange, prepare behaviour Helper aMock = mock(Helper.class); when(aMock.isCalled()).thenReturn(true); // Act testee.doSomething(aMock); // Assert - verify interactions verify(aMock).isCalled(); }
when(...).then*(...) when(methodIsCalled).thenReturn(aValue); when(methodIsCalled).thenThrow(anException);
Real Code Properties properties = mock(Properties.class); when(properties.get(”shoeSize”)).thenReturn(”42”); String result = properties.get(”shoeSize”); assertEquals(”42”, result);
Real Code Properties properties = mock(Properties.class); when(properties.get(”shoeSize”)).thenReturn(”42”); String result = properties.get(”shoeSize”); assertEquals(”42”, result); // optional verify(properties).get(”shoeSize”);
when(...) when(methodIsCalled) aMockObject.method(arguments...) properties.get(”42”) properties.get(anyString()) properties.get(eq(”42”))
thenReturn(value) Properties properties = mock(Properties.class); when(properties.get(”shoeSize”)) .thenReturn(”42”)); String value = properties.get(”shoeSize”); assertEquals(”42”, value);
thenThrow(Exception) Properties properties = mock(Properties.class); when(properties.get(”shoooSize”)) .thenThrow(new IllegalArgumentException(...)); try { properties.get(”shoooSize”); fail(”shoooSize is misspelled”); } catch (IllegalArgumentException e) { // good! :) }
thenReturn(...) Properties properties = mock(Properties.class); when(properties.get(”shoeSize”)) .thenReturn(”42”, ”43”, ”44”)); assertEquals(”42”, properties.get(”shoeSize”)); assertEquals(”43”, properties.get(”shoeSize”)); assertEquals(”44”, properties.get(”shoeSize”)); assertEquals(”44”, properties.get(”shoeSize”)); assertEquals(”44”, properties.get(”shoeSize”)); assertEquals(”44”, properties.get(”shoeSize”));
Creating Mock Objects ClassToMock mockObject = mock(ClassToMock.class); egentligen: Mockito.mock(ClassToMock.class);
Creating Mock Objects ClassToMock mockObject = mock(ClassToMock.class); @Mock ClassToMock mockObject; @Before public void setup() { MockitoAnnotations.initMocks(this); }
Verifying Invocation On Mocks // simple ”equals” verify(properties).get(”property”); // matchers verify(properties).get(eq(”property”));
The IDE Can Help 1 • Window » Preferences » Java » Editor » Content Assistant » Favorites ● org.junit.Assert.* assertTrue() ● org.mockito.Mockito.* mock() ● org.mockito.MockitoAnnotations @Mock ● org.mockito.BDDMockito.* given().then*()
The IDE Can Help 2 • Window » Preferences » Java » Editor » Templates ${staticImport:importStatic( 'org.mockito.MockitoAnnotations. initMocks')} @${beforeAnnotation: newType(org.junit.Before)} public void ${setUp}() { initMocks(this); ${cursor} }
The IDE Can Help 3 • Window » Preferences » Java » Editor » Templates tdd @Test public void ${test} throws Exception { // Arrange // Act // Assert }
public class EmptyMatcher extends TypeSafeMatcher<Collection <?>> { @Override public boolean matchesSafely(Collection<?> c) { return c.isEmpty(); } public void describeTo(Description desc) { desc.appendText("empty"); } @Factory public static <T> Matcher<? super Collection<?>> isEmpty() { return new EmptyMatcher(); } }

Using Mockito

  • 1.
  • 2.
    This work by FredrikWendt is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License http://creativecommons.org/licenses/by-nc-sa/3.0/
  • 3.
    Outline • mock(ClassToMock.class) • when(methodCall) ●thenReturn(value) ● thenThrow(Throwable) • verify(mock).method(args) • @Mock • initMocks(this) • assertThat(obj, matcher) • Eclipse IDE tips
  • 4.
    Why Mockito -and when? Use Mockito to get ”smart” fake implementations of classes or interfaces out of your reach.
  • 5.
    Classical 3A Test @Test publicvoid test() throws Exception { // Arrange // Act // Assert }
  • 6.
    Classical 3A Test @Test publicvoid test() throws Exception { // Arrange UnitToTest testee = new UnitToTest(); Helper helper = new Helper(); // Act testee.doSomething(helper); // Assert assertTrue(helper.somethingHappened()); }
  • 7.
    Mockito ”Template” Usage @Test publicvoid test() throws Exception { // Arrange, prepare behaviour Helper aMock = mock(Helper.class); when(aMock.isCalled()).thenReturn(true); // Act testee.doSomething(aMock); // Assert - verify interactions verify(aMock).isCalled(); }
  • 8.
  • 9.
    Real Code Properties properties= mock(Properties.class); when(properties.get(”shoeSize”)).thenReturn(”42”); String result = properties.get(”shoeSize”); assertEquals(”42”, result);
  • 10.
    Real Code Properties properties= mock(Properties.class); when(properties.get(”shoeSize”)).thenReturn(”42”); String result = properties.get(”shoeSize”); assertEquals(”42”, result); // optional verify(properties).get(”shoeSize”);
  • 11.
  • 12.
    thenReturn(value) Properties properties =mock(Properties.class); when(properties.get(”shoeSize”)) .thenReturn(”42”)); String value = properties.get(”shoeSize”); assertEquals(”42”, value);
  • 13.
    thenThrow(Exception) Properties properties =mock(Properties.class); when(properties.get(”shoooSize”)) .thenThrow(new IllegalArgumentException(...)); try { properties.get(”shoooSize”); fail(”shoooSize is misspelled”); } catch (IllegalArgumentException e) { // good! :) }
  • 14.
    thenReturn(...) Properties properties =mock(Properties.class); when(properties.get(”shoeSize”)) .thenReturn(”42”, ”43”, ”44”)); assertEquals(”42”, properties.get(”shoeSize”)); assertEquals(”43”, properties.get(”shoeSize”)); assertEquals(”44”, properties.get(”shoeSize”)); assertEquals(”44”, properties.get(”shoeSize”)); assertEquals(”44”, properties.get(”shoeSize”)); assertEquals(”44”, properties.get(”shoeSize”));
  • 15.
    Creating Mock Objects ClassToMockmockObject = mock(ClassToMock.class); egentligen: Mockito.mock(ClassToMock.class);
  • 16.
    Creating Mock Objects ClassToMockmockObject = mock(ClassToMock.class); @Mock ClassToMock mockObject; @Before public void setup() { MockitoAnnotations.initMocks(this); }
  • 17.
    Verifying Invocation OnMocks // simple ”equals” verify(properties).get(”property”); // matchers verify(properties).get(eq(”property”));
  • 18.
    The IDE CanHelp 1 • Window » Preferences » Java » Editor » Content Assistant » Favorites ● org.junit.Assert.* assertTrue() ● org.mockito.Mockito.* mock() ● org.mockito.MockitoAnnotations @Mock ● org.mockito.BDDMockito.* given().then*()
  • 19.
    The IDE CanHelp 2 • Window » Preferences » Java » Editor » Templates ${staticImport:importStatic( 'org.mockito.MockitoAnnotations. initMocks')} @${beforeAnnotation: newType(org.junit.Before)} public void ${setUp}() { initMocks(this); ${cursor} }
  • 20.
    The IDE CanHelp 3 • Window » Preferences » Java » Editor » Templates tdd @Test public void ${test} throws Exception { // Arrange // Act // Assert }
  • 21.
    public class EmptyMatcherextends TypeSafeMatcher<Collection <?>> { @Override public boolean matchesSafely(Collection<?> c) { return c.isEmpty(); } public void describeTo(Description desc) { desc.appendText("empty"); } @Factory public static <T> Matcher<? super Collection<?>> isEmpty() { return new EmptyMatcher(); } }

Editor's Notes

  • #5 out of reach: * too hard to setup * Singletons * Interfaces without proper classes