Skip to content

Instantly share code, notes, and snippets.

@heridev
Last active August 11, 2018 14:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save heridev/1e7074555b75264c2bb8d7716bc4ccb2 to your computer and use it in GitHub Desktop.
Save heridev/1e7074555b75264c2bb8d7716bc4ccb2 to your computer and use it in GitHub Desktop.
Refactoring the app into MVP : First part

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();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment