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

Mocking workshop at Groupon

Mocking workshop at Groupon

Provides the theoretical background to understand mocks and use mocks with RoboGuice.

stephanenicolas

March 12, 2015
Tweet

More Decks by stephanenicolas

Other Decks in Programming

Transcript

  1. Mocking
    Why ? What ? When ?

    View Slide

  2. Then the Queen left off, quite out of breath, and said
    to Alice, "Have you seen the Mock Turtle yet?"
    "No," said Alice. 

    "I don't even know what a Mock Turtle is."
    "It's the thing Mock Turtle Soup is made from," 

    said the Queen.
    —Alice in Wonderland, chapter 9 2

    View Slide

  3. Presentation plan
    Mocking on Android
    1. Why,  what  &  when  mocking  ?  
    2. A  simple  test  
    3. Tes1. DI  
    2. stubs  
    4. Tests,  stubs  &  DI  with  RG  
    5. Mocks  
    6. Mocking  simpler  with  RG  

    View Slide

  4. Why Mocking ?
    Mocking on Android
    Most  parts  of  a  soIware  system  do  not  work  in  
    isolatheir  job  done.  
    In  a  lot  of  cases,  we  do  not  care  about  using  real  
    collaborators   implementawe  trust  these  collaborators.  
    Henri  Tremblay,  easymock  author  

    View Slide

  5. What to mock ?
    Mocking on Android
    When testing a component A, we mock the
    dependencies of A (that are used in each tests).
    Here, when testing ComputerNextBusinessDay, we would
    mock NextDayFinder and BusinessDayChecker.

    View Slide

  6. When to mock ?
    Mocking on Android
    The answer is simple : as soon as you got a dependency.
    Nevertheless, as you will see, when mocking becomes too complex, it often means
    that your class should be split and redesigned.
    Mocking makes testing more complicated. Try to stick to a common/comprehensible
    structure inside your project’s tests, this will make them much easier to read. 

    Further on, we will see : ‘’GIVEN WHEN TEST‘’ which is a good structure, but not
    the only one.

    View Slide

  7. Warmup : a simple test
    Mocking on Android
    demo (branch : sni/mock-workshop). git co -b temp 41cecac

    View Slide

  8. General tests advises
    Mocking on Android
    • Do not, ever, add logic for a test. You would need to test it…
    • Use test coverage tools to see how much your code is tested.
    • Structure your tests
    • Name your tests well 

    (At Groupon we now use
    testSomething_should_returnSomethingOrDoSomething_when_thisConditionOrThisConditionApplies)
    • Always use the same assertion set, do not mix. We use Hamcrest and core
    matchers.
    • Do not make tests slow. (>100ms). It kills the team productivity.
    • Do never use system date, make all tests 100% reproducible

    View Slide

  9. Testing a Component
    Mocking on Android
    demo (branch : sni/mock-workshop). git co -b temp ed6b8b

    View Slide

  10. Testing a Component
    Mocking on Android
    Things to do :
    1. Test NextDayFinder
    2. Test BusinessDayChecker
    3. Test ComputerNextBusinessDay

    View Slide

  11. Units and Systems
    Mocking on Android
    A B
    C
    In this case, B and C can be unit tested as they have no dependencies.

    But unit-testing A is not possible as A is indeed a system : 

    A = {A, B, C}

    View Slide

  12. How to test a system ?
    Mocking on Android
    A B
    C

    View Slide

  13. Using fake dependencies
    Mocking on Android
    A B
    C
    If we had fake B and fake C, that we fully control, then we could test
    A as a unit, decoupled from B and C.

    View Slide

  14. 2 sub problems
    Mocking on Android
    A B
    C
    There are then 2 subproblems :
    1. How to make A use fake B and fake C for tests ?
    2. How to create fake B and fake C ?

    View Slide

  15. How to make A use fake B and fake C for tests ?
    Mocking on Android
    A B
    C
    DI to the rescue !!

    (actually, inversion of control)

    View Slide

  16. How to make A use fake B and fake C for tests ?
    Mocking on Android

    View Slide

  17. How to make A use fake B and fake C for tests ?
    Mocking on Android

    View Slide

  18. How to create fake B and fake C ?
    Mocking on Android
    In the literature, such classes are called Stubs.

    They are fake objects, fully controllable, and their state can be tested.

    Stubs have no limits and can be very complex.

    View Slide

  19. Testing a System with Stubs
    Mocking on Android
    demo (branch : sni/mock-workshop). git co -b temp 5ffa6f
    RoboGuice makes it easy to inject stubs. Each test that extends
    GrouponTestBase can provide its own modules.

    View Slide

  20. Mocks !
    Mocking on Android
    demo (branch : sni/mock-workshop). git co -b temp b1fef
    A Mock Object is a test-oriented replacement for a collaborator. It is
    configured to simulate the object that it replaces in a simple way.
    Henri Tremblay, still…
    Mocks are Stubs made easy. 

    …With some subtile differences.

    View Slide

  21. Mocks are statefull
    Mocking on Android
    1. createMock create a mock of a class / interface
    2. expect configures mock calls that are expected during a test
    When all expectations are defined, you have to call replay

    PRIOR TO launching the test.

    View Slide

  22. Mocks are statefull
    Mocking on Android
    3. Mock are replayed during a test
    4. Mocks can be verified
    Mock verification has the same value as an assertion.
    Mocks can be reset between tests to allow orthogonal testing.

    View Slide

  23. General mocking advises
    Mocking on Android
    • Mock ALL your dependencies. Otherwise you run real code, which is bad :
    • it appears as covered by tests while it is not. You bullshit yourself.
    • it slows down tests
    • it is not a unit test
    • Learn advanced mocking techniques :
    • Partial mocking & using final
    • Captures
    • If you can’t mock it as you want, it’s wrong.

    View Slide

  24. RG makes mocking easier
    Mocking on Android
    With RG we automate mock creation for you.
    Simply annotate the dependencies you wanna mock.
    demo (branch : sni/mock-workshop). git co -b temp 964bcb

    View Slide

  25. RG makes mocking easier
    Mocking on Android
    With RG, helpers are provided to replay and verify mocks.
    All mocks are reset automatically between tests.

    View Slide

  26. RG makes mocking easier
    Mocking on Android
    With RG, we create a module
    with all @Mock annotated fields for you.

    View Slide

  27. Mocking : Dos and Don’ts
    Mocking on Android
    Dos:
    1. mock when possible, more than
    all when the real implementation
    is costly (DB, network)
    2. design classes to be mocked
    easily (avoid final & static
    methods)
    3. Use DI to inject mocks
    4. verify state changing methods
    Don’ts:
    1. overuse mocks. When there are
    too many things to mock, there is
    probably a better design.
    2. don’t forget to reset mocks
    3. don’t forget to replay mocks

    View Slide

  28. Mocking on Android
    Questions ?
    Comments ?

    View Slide