* I stand corrected. A commenter, Kiran Gunda, says it’s possible to mock f inal methods with JMockIt. I may have set the mock up incorrectly. If I try again, I’ll update this post. Until then, an updated post describes how I used Android test classes to run my code. Matt also pointed out that JMock can mock final methods using JDave’s unfinalizer.
* Updated July 11, 2009 to remove some incorrect information
So that you don’t have to read this whole post, I’ll sumarize what I discovered. If you’re thinking about using a mocking library to mock Android classes, don’t. Android uses interfaces sparsely. That makes a clean API with lots of reusable code, but makes mocking difficult. The real problem, though, is caused by Android’s generous use of final methods. I don’t know of any mocking library that can mock final methods, so you just can’t do it. Instead of writing mocks, look into the android.test and android.test.mock packages.
I developed GreenMileage so that I could learn about the Android OS. Now that I have an understanding of it, I decided to go back and write test cases so that I could continue development using TDD. I started by writing tests for utility classes. That wasn’t a problem. After finishing that, I moved to some simple UI cases. The first was TextViewCallbackListener. I just had to mock TextView.setText(String).
First, I spent hours just trying to get the JMock jars into the project. For some reason, the compiler would not put JMock into the APK. I didn’t get any error message or notification. It just wasn’t there.
I decided to use Android’s test mocks to run my code. Click here to see a simple example.