Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Mockito 2022-01-25

sullis
January 25, 2022

Mockito 2022-01-25

Unit testing with Mockito
Portland Java User Group
January 25, 2022

#java
#mockito

sullis

January 25, 2022
Tweet

More Decks by sullis

Other Decks in Programming

Transcript

  1. Unit testing
    with Mockito
    Sean Sullivan
    Portland Java User Group
    January 25, 2022

    View Slide

  2. Unit Tests

    View Slide

  3. • Mockito library
    • Upgrading to Mockito 4
    • Extending Mockito
    • Anti-patterns

    View Slide

  4. Mockito is a framework
    for creating Mock objects

    View Slide

  5. a Mock object mimics the
    behavior of a real object

    View Slide

  6. Gilt.com
    checkout system

    View Slide

  7. We wrote unit tests to verify:
    • happy path
    • edge case scenarios
    • error handling logic

    View Slide

  8. • inventory reservation
    • payment system
    • shipping cost calculator
    • shipping restrictions
    • purchase limit service
    • tax calculator
    • discount calculator
    Gilt.com Checkout was dependent upon:

    View Slide

  9. The test suite for
    Gilt.com Checkout
    used Mockito

    View Slide

  10. We setup mock objects for:
    • Payment authorization
    • Inventory reservation
    • Discount redemption
    • Tax calculation
    • Shipping calculation

    View Slide

  11. Maven pom.xml

    org.mockito
    mockito-core
    4.3.1
    test

    View Slide

  12. import static org.mockito.Mockito.mock;
    import static org.mockito.Mockito.when;
    import static org.mockito.Mockito.verify;
    import static org.mockito.ArgumentMatcher.any;

    View Slide

  13. TaxEngine taxEngine = mock(TaxEngine.class);
    ShippingCostCalculator shippingCalc = mock(ShippingCostCalculator.class);
    when(taxEngine.calculate(any())).thenReturn(new Money(5, USD));
    when(shippingCalc.calculate()).thenReturn(shippingInfo);

    View Slide

  14. OrderManager unit test
    OrderManager manager = new OrderManager(
    taxEngine,
    shippingCalc);
    manager.sync(order);
    manager.submit(order);
    verify(taxEngine, once()).calculate(any());
    assertTrue(order.isSubmitted());

    View Slide

  15. Mockito.when

    View Slide

  16. thenReturn

    View Slide

  17. How do I mimic a
    failure?

    View Slide

  18. use thenThrow

    View Slide

  19. TaxEngine taxEngine = mock(TaxEngine.class);
    when(taxEngine.calculate(any(), any()))
    .thenThrow(new TaxViolationException());

    View Slide

  20. Four major versions of Mockito
    • version 1.x
    • version 2.x
    • version 3.x
    • version 4.x

    View Slide

  21. Upgrading to
    Mockito 4.x

    View Slide

  22. View Slide

  23. View Slide

  24. View Slide

  25. View Slide

  26. async-http-client
    PR 1812

    View Slide

  27. async-http-client
    PR 1812

    View Slide

  28. async-http-client
    PR 1812

    View Slide

  29. async-http-client
    PR 1812

    View Slide

  30. async-http-client
    PR 1812

    View Slide

  31. What if
    my company has
    500 Git repos?

    View Slide

  32. Automated
    refactoring tool

    View Slide

  33. OpenRewrite
    https://moderne.io/

    View Slide

  34. OpenRewrite

    View Slide

  35. OpenRewrite

    View Slide

  36. mockito.yml

    View Slide

  37. Extending Mockito

    View Slide

  38. Answer interface
    public interface Answer {


    T answerInvocation(InvocationOnMock invocation);


    }


    View Slide

  39. MockitoPlus library

    View Slide

  40. MockitoPlus

    View Slide

  41. MockitoPlus
    import static org.mockito.Mockito.mock;
    import static io.github.mockitoplus.MockitoPlus.when;

    View Slide

  42. MockitoPlus
    HelloWorld hello = mock(HelloWorld.class);
    when(hello.sayHello(any()))
    .thenReturn("bonjour")
    .failAlternatingInvocations();

    View Slide

  43. MockitoPlus
    HelloWorld hello = mock(HelloWorld.class);
    when(hello.sayHello(any()))
    .thenReturn("bonjour")
    .
    fi
    rstInvocationFails();

    View Slide

  44. MockitoPlus
    HelloWorld hello = mock(HelloWorld.class);
    when(hello.sayHello(any()))
    .thenReturn("bonjour")
    .intermittentFailures()
    .randomDelay(Duration.of(500, MILLIS));
    Intermittent failures
    with random delays

    View Slide

  45. Mockito anti-patterns

    View Slide

  46. // anti-pattern
    List names = mock(List.class);
    // better
    List names = new ArrayList();
    anti-pattern

    View Slide

  47. // anti-pattern
    Optional name = mock(Optional.class);
    // better
    Optional name = Optional.of(“Obama”);
    anti-pattern

    View Slide

  48. // anti-pattern
    CompletableFuture f = mock(CompletableFuture.class);
    // better
    CompletableFuture f = CompletableFuture.completedFuture(“bonjour”);
    anti-pattern

    View Slide

  49. what about Scala?

    View Slide

  50. View Slide

  51. “org.mockito” %% "mockito-scala" % “1.16.34” % Test
    build.sbt

    View Slide

  52. import org.mockito.scalatest.MockitoSugar
    Scala trait

    View Slide

  53. Questions?

    View Slide

  54. The End
    @tinyrobots

    View Slide