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<book> 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<Book> 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();
}
}
}