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
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
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
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.
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.
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
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}
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.
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 ?
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.
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.
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.
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.
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.
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.
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
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