Search code examples
androidunit-testingmockingioc-containerandroid-annotations

Is it possible to inject mocks for testing purposes with AndroidAnnotations?


I haven't found any examples on how to do this. I'm assuming it is not possible based on examples like this:

@Bean(MyImplementation.class)
MyInterface myInterface;

where the class to inject is already determined.


Solution

  • The question is, are you unit testing or integration testing?

    If you are unit testing, I would suggest using mocks the old fashioned way, by using a setter and trying to test the Java code without the dependency injection framework involved. This will test your class in isolation and sidesteps a lot of complexity.

    What I mean:

    public class Test{
    
        ClassInTest inTest;
        MyInterface myInterface;
    
        @Before
        public void setup(){
             inTest = new ClassInTest();
             //or your favorite mocking frameowrk
             myInterface = EasyMock.createMock(MyInterface.class);  
             inTest.setMyInterface(myInterface);
        }
    
        @Test
        public void testMethod(){
            //...mocking test code
        }
    }
    

    Of course, testing Android Activities (and other extensions of Android) is difficult because of the exception throwing stubs and final classes/methods. This is where Robolectric comes in handy (and highly recommended) for instantiating/shadowing the Android API.

    If you are integration testing you may want to take another approach. Personally, I would try not to mock during integration tests as I try to test the application as it would run in production. But, if you really want to mock, you could use a similar approach to unit testing and introduce a mock after you stand up your generated Activity class. Worth noting, you can perform integration tests directly on the hardware using frameworks like Robotium.

    More to your question, I am not aware of any facilities of AndroidAnnotations specifically for injecting Mocks or introducing Mocks into the injected dependency tree of an application.