Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Testable Android Architecture (Part 2)

Chuck Greb
November 15, 2016

Testable Android Architecture (Part 2)

We have so many testing tools for Android now including JUnit, Mockito, Robolectric, and Espresso. But how can you design your application to leverage each one most effectively? This talk introduces a modified version of Model View Presenter (MVP) to help organize your code to be more flexible, maintainable, and testable.

The first half of this talk will recap my presentation from Droidcon NYC 2016. The second half will explore advanced use cases, in-depth code samples, and audience Q&A.

Chuck Greb

November 15, 2016
Tweet

More Decks by Chuck Greb

Other Decks in Technology

Transcript

  1. Art is anything you can do well. Anything you can

    do with Quality. “ ” - Robert M. Pirsig
  2. → MVC Model View Controller → MVP Model View Presenter

    → MVVM Model View ViewModel Clean Architecture Design patterns
  3. Fragment Activity EditText Button Web Service Storage AsyncTask Activity Lifecycle

    System Services Fragment Fragment Lifecycle User Input Input Validation
  4. Fragment Activity Web Service Storage AsyncTask Activity Lifecycle System Services

    Fragment Fragment Lifecycle User Input setRetainInstance(true) EditText Button Input Validation
  5. Fragment Activity Web Service Storage AsyncTask Activity Lifecycle System Services

    Fragment Fragment Lifecycle User Input setRetainInstance(true) Intent Parcelable Extras EditText Button Input Validation
  6. Web Service Storage Activity Fragment Fragment AsyncTask setRetainInstance(true) Activity Lifecycle

    Fragment Lifecycle System Services User Input Intent Activity Instrumentation TestCase2 Parcelable Extras EditText Button Input Validation
  7. - Phil Karlton There are only two hard problems in

    computer science: cache invalidation and naming things “ ”
  8. Web Service Storage Activity Activity Lifecycle System Services User Input

    Presenter View Model Controller Button EditText Thread Input Validation start()
  9. Web Service Storage Activity Activity Lifecycle System Services User Input

    Presenter View Model Controller Button EditText Input Validation Thread start()
  10. A test is not a unit test if: → It

    talks to the database → It communicates across the network → It touches the file system → It can't run at the same time as any of your other unit tests → You have to do special things to your environment (such as editing config files) to run it. Michael Feathers, 2005 A Set of Unit Test Rules
  11. → Global singleton → Scoped singleton → View State Manager

    Q & A What is the best way to manage presenter scope or lifecycle?
  12. Web Service Storage Activity Activity Lifecycle System Services User Input

    Presenter View Model Controller Button EditText Thread Input Validation start()
  13. Web Service Storage Activity Activity Lifecycle System Services User Input

    Presenter View Model Controller Button EditText Thread Input Validation start() ViewState Manager (VSM)
  14. View Presenter Activity Activity Lifecycle System Services User Input Main

    Presenter View Controller Button EditText Input Validation Model
  15. → Pass the message “around the horn” → Event bus

    Q & A How do you communicate between multiple presenters?
  16. → Choose an architecture appropriate to your use case →

    Write tests that work in concert with your architecture → Don’t be overly dogmatic Conclusion So which architecture and testing strategy should I use for my app?