Introduction to
       AndroidMock

Li-Wei Cheng
Outline
•   What's Mock Object ?
•   Popular Mock libraries.
•   Why using AndroidMock ?
•   Example
•   Use AndroidMock in app
•   Use AndroidMock in system service
What's Mock Object ?
•   A simulated objects that mimic the behavior of
    real objects in controlled ways.
•   Usually used in Unit Test Framework.
    o   Used to do the isolation test.

•   Java has many popular mock libraries such as
    EasyMock, JMock ... etc.
•   Android also has its mock library called
    AndroidMock.
Popular mock libraries
•   EasyMock
    o   Java
    o   EasyMock 3.1 has the feature for Class Mocking

•   JMock
    o   Java                   Mock Library
•   moQ
    o   .NET
                            Interface          Class
                                        +
•   Google Mock
                            Mocking           Mocking


    o   C++
Why using AndroidMock ?
•   Dalvik VM is limited for supporting mocking.
•   EasyMock only can support interface mocking
    in Dalvik VM even it has realized the class
    mocking.
•   AndroidMock is based on EasyMock.
•   AndoirdMock's class mocking is achieved by
    o   Interface Mocking to EasyMock
    o   Use annotation to generate the helper class
Example
package com.google.android.testing.mocktest.test;
import com.google.android.testing.mocking.AndroidMock;



public class MockingTest extends TestCase {
    @UsesMocks(ClassToMock.class)                  1. pre-generate the helper class for AndroidMock
    public void testMocks() throws ClassNotFoundException {
        ClassToMock myMockObject =                 2. create a mock object
                                 AndroidMock.createMock(ClassToMock.class);
        AndroidMock.expect(myMockObject.getString()).andReturn("Woohoo");
        AndroidMock.expect(myMockObject.getNextInt(2)).andReturn(42);            3. record behavior
        AndroidMock.replay(myMockObject);           4. replay the behavior
        assertEquals("Woohoo", myMockObject.getString());
        assertEquals(42, myMockObject.getNextInt(2));                            5. test

        AndroidMock.verify(myMockObject);
                                             6. verified whether all the record behaviors are executed
    }
}
Compilation flow for AndroidMock
Limitation for AndroidMock( EasyMock)
•   It can't mock final method.
    o   If it mocks, it will execute the origin logic.

•   It can't mock static method.
    o   If it mocks, it will execute the origin logic.

•   It can't mock private method.
    o   If it mocks, it will execute the origin logic.

•   some special methods can't be mocked
    o equals()
    o toString()
    o hashCode()
Reference
•   http://code.google.com/p/android-mock/
•   http://en.wikipedia.org/wiki/Mock_object
Appendix
•   Setup the Eclipse to use AndroidMock
    o   Setup AndroidMock in the Eclipse.doc
Any Question ?

Introduction to AndroidMock

  • 1.
    Introduction to AndroidMock Li-Wei Cheng
  • 2.
    Outline • What's Mock Object ? • Popular Mock libraries. • Why using AndroidMock ? • Example • Use AndroidMock in app • Use AndroidMock in system service
  • 3.
    What's Mock Object? • A simulated objects that mimic the behavior of real objects in controlled ways. • Usually used in Unit Test Framework. o Used to do the isolation test. • Java has many popular mock libraries such as EasyMock, JMock ... etc. • Android also has its mock library called AndroidMock.
  • 4.
    Popular mock libraries • EasyMock o Java o EasyMock 3.1 has the feature for Class Mocking • JMock o Java Mock Library • moQ o .NET Interface Class + • Google Mock Mocking Mocking o C++
  • 5.
    Why using AndroidMock? • Dalvik VM is limited for supporting mocking. • EasyMock only can support interface mocking in Dalvik VM even it has realized the class mocking. • AndroidMock is based on EasyMock. • AndoirdMock's class mocking is achieved by o Interface Mocking to EasyMock o Use annotation to generate the helper class
  • 6.
    Example package com.google.android.testing.mocktest.test; import com.google.android.testing.mocking.AndroidMock; publicclass MockingTest extends TestCase { @UsesMocks(ClassToMock.class) 1. pre-generate the helper class for AndroidMock public void testMocks() throws ClassNotFoundException { ClassToMock myMockObject = 2. create a mock object AndroidMock.createMock(ClassToMock.class); AndroidMock.expect(myMockObject.getString()).andReturn("Woohoo"); AndroidMock.expect(myMockObject.getNextInt(2)).andReturn(42); 3. record behavior AndroidMock.replay(myMockObject); 4. replay the behavior assertEquals("Woohoo", myMockObject.getString()); assertEquals(42, myMockObject.getNextInt(2)); 5. test AndroidMock.verify(myMockObject); 6. verified whether all the record behaviors are executed } }
  • 7.
  • 8.
    Limitation for AndroidMock(EasyMock) • It can't mock final method. o If it mocks, it will execute the origin logic. • It can't mock static method. o If it mocks, it will execute the origin logic. • It can't mock private method. o If it mocks, it will execute the origin logic. • some special methods can't be mocked o equals() o toString() o hashCode()
  • 9.
    Reference • http://code.google.com/p/android-mock/ • http://en.wikipedia.org/wiki/Mock_object
  • 10.
    Appendix • Setup the Eclipse to use AndroidMock o Setup AndroidMock in the Eclipse.doc
  • 11.