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. 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
  2. Presentation plan Mocking on Android 1. Why,  what  &  when

     mocking  ?   2. A  simple  test   3. Tes<ng  a  system   1. DI   2. stubs   4. Tests,  stubs  &  DI  with  RG   5. Mocks   6. Mocking  simpler  with  RG  
  3. Why Mocking ? Mocking on Android Most  parts  of  a

     soIware  system  do  not  work  in   isola<on,  but  collaborate  with  other  parts  to  get   their  job  done.   In  a  lot  of  cases,  we  do  not  care  about  using  real   collaborators   implementa<on   in   unit   tes<ng,   as   we  trust  these  collaborators.   Henri  Tremblay,  easymock  author  
  4. 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.
  5. 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.
  6. Warmup : a simple test Mocking on Android demo (branch

    : sni/mock-workshop). git co -b temp 41cecac
  7. 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
  8. Testing a Component Mocking on Android Things to do :

    1. Test NextDayFinder 2. Test BusinessDayChecker 3. Test ComputerNextBusinessDay
  9. 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}
  10. 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.
  11. 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 ?
  12. 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)
  13. How to make A use fake B and fake C

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

    for tests ? Mocking on Android
  15. 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.
  16. 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.
  17. 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.
  18. 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.
  19. 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.
  20. 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.
  21. 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
  22. RG makes mocking easier Mocking on Android With RG, helpers

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

    create a module with all @Mock annotated fields for you.
  24. 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