As with most object oriented realms, attempt to simplify the architecture as much as possible. Do this by creating abstract or base objects or interfaces. This way you can test shared behavior in one place instead of several, which simplifies tests and reduces code duplication.
Often we want to ensure that a certain action was performed but not actually run the code. To do this, you create a test class which extends the class under test and override/mock out/track that a particular function was called.
For example, if you want a particular click to make an API call, there is no need to make the actual call (since this would be an integration level test anyway). You can use this strategy to track that the function that invokes the call has been called, but avoid making the actual call.
This is can also be helpful when an operation crashes the unit testing framework (e.g. specialty library that causes funky side effects), doesn't play nice, or is otherwise unnecessary to invoke directly.
I create several utility classes to improve the readability of my code. These live in my test structure under the package support
. We'll add these files in the next lab.
Android strongly encourages the use of abstracting string resources into one place over using hard-coded string constants. I like to follow a similar pattern and use a test constants class when you have lots of test data. This can be really helpful when creating a user with lots of fields to mock out a JSON response.
If you find yourself writing something more than once, that's an excellent time to reassess. Luckily since you will have a large base of unit tests at your disposal as well as powerful IDE tools, the refactoring will have minimal impact on the rest of the system!
Finally, you shouldn't rely solely on unit tests to ensure the proper behavior of your app. These tests, though quite useful, only give you a small window into your app and it's behavior. At minimum, you should include integration level tests and have some level of manual QA in the process to ensure your app is everything that you want it to be.