Let's start changing the repository to trigger an exception(typo in the orderby clause):
DatabaseBooksRepository.java
public class DatabaseBooksRepository implements BooksRepository {
private final DatabaseHelper databaseHelper;
public DatabaseBooksRepository(Content context) {
databaseHelper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
}
@Override
public List<Book> getBooks(){
try{
return databaseHelper.getbookDaO().queryBuilder()
.orderBy("orderXXX", tru)
.query();
} catch {
throw new RuntimeException("boom");
}
}
}
the new scenario for testing it would look like this: BooksActivityPresenterTest.java
import org.junit.Test;
import org.junit.Asserts;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
public class BooksActivityPresenterTest {
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock
BooksRepository booksRepository;
@Mock
BooksActivityView view;
BooksActivityPresenter presenter;
@Before
public void setUp() { presenter = new BooksActivityPresenter(view, booksRepository); }
@Test
public void shouldHandleAnException() {
Mockito.when(booksRepository.getBooks())
.thenThrown(new RuntimeException("boom")));
presenter.loadBooks();
Mockito.verify(view).displayError();
}
}
Now we need to implement this new displayError method: BooksActivityView.js
public interface BookActivityView {
void displayBooks(List<Book> bookList);
void displayNoBooks();
void displayError();
}
And as our BooksActivity implements this interface we need to declare there our view method and the logic for that:
BooksActivity.java
public class BooksActivity extend BaseActivity implements BooksActivityView { private BooksActivityPresenter presenter; @override protected void onCreate(...){ .... }
@Override public void displayBooks(List bookList) { ... }
@Override public void displayNoBooks() { ... };
@Override public void displayError() { Toast.makeText(this, "Errror accessing data", Toast.LENGTH_SHORT).show(); }; }
And we need to reflect this change on the main:
BooksActivityPresenter.java
public class BooksActivityPresenter { public BooksActivityPresenter(BooksActivityView view, BooksRepository booksRepository) { this.view = view; this.booksRepository = booksRepository }
public void loadBooks(){ List listBooks; try { listBooks = booksRepository.getBooks(); // Here the presenter does not know anything about the repository // the presenter just wait for getting an array of values and that's it if(listBooks.isEmpty()){ view.displayNoBooks(); } else { view.displayBooks(bookList); } } catch(Exception e) { view.displayError(); }
} }