Created following this sets of tutorials: https://www.youtube.com/watch?v=ZWYOy8E4jWo&index=1&list=PLtRrDEpV3zkvVd3gpUS8oJDh1iPXGzDHj We start with a huge BooksActivity.java class so we are going to split it into MVP and in order to have more control when testing that.
BooksActivity.java
public class BooksActivity extends AppCompatActivity implements BooksActivityView {
//SHORTCUTS
//Alt + Enter (field name)
//Alt + Insert (constructors)
//Ctrl + Space (missing classes)
//Ctrl + Shift + T (create test)
//Ctrl + Shift + F10 (run test)
//.var new Book().var => Book book = new Book();
BooksActivityPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
BooksActivityView booksActivityView = this;
presenter = new BooksActivityPresenter(booksActivityView, null);
}
//______________________________________________________________________________________________
@Override
public void displayBooks(List<Book> bookList) {
}
@Override
public void displayNoBooks() {
}
}
BooksActivityPresenter.java
public class BooksActivityPresenter {
public BooksActivityPresenter(BooksActivityView view, BooksRepository booksRepository) {
this.view = view;
this.booksRepository = booksRepository
}
public void loadBooks(){
List<Book> 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);
}
}
}
BooksActivityView.js
public interface BooksActivityView {
void displayBooks(List<Book> bookList);
void displayNoBooks();
}
Now we start with the tests yaay: BooksActivityPresenterTest.java
import org.junit.Test;
import org.junit.Assets;
public class BooksActivityPresenterTest {
@Test
public void shouldPass() {
Asset.assertEqual(1, 1);
}
@Test
public void shouldPassBookToView() {
//give
BooksActivityView view = new MockView();
BooksRepository booksRepository = new MockBooksRepository(true);
//when
BooksActivityPresenter presenter = new BooksActivityPresenter(view, booksRepository);
presenter.loadBooks();
//then
// here we are checking that the actual view got invoked as we are change the passed to
// true whenever it is invoked or triggered that method
Assert.assertEquals(true, ((MockView) view).displayBooksFound);
}
@Test
public void shouldHandleNoBooksFound() {
// Given
BooksActivityView view = new MockView();
BookRepository booksRepository = new MockBooksRepository(false);
// When
BooksActivityPresenter presenter = new BooksActivityPresenter(view, booksRepository);
// Then
Assert.assertEquals(true, ((MockView) view).displayBooksNoFound)
}
}
private class MockView implements BooksActivityView {
boolean displayBooksFound;
boolean displayBooksNoFound;
@Override public void displayBooks(List<Book> bookList){
if(bookList.size() == 3){
displayBooksFound = true;
}
}
@Override public void displayNoBooks(){
displayBooksNoFound = true;
}
}
private class MockBooksRepository implements BooksRepository {
public MockBooksRepository(boolean returnSomeBooks) {
this.returnSomeBooks = returnSomeBooks;
}
@Override public List<Book> getBooks(){
if(returnSomeBooks) {
return Arrays.asList(new Book(), new Book(), new Book());
} else {
return Collections.emptyList();
}
}
}
The repository for retrieveing data repositories/BooksRepository.java
public interface BooksRepository {
List<Book> getBooks();
}