Advanced Unit Test Business Logic Asynchronous di Aplikasi Android Berarsitektur MVP

by Andika Wasisto

PPL A2
2 min readApr 3, 2018

Salah satu keuntungan penggunaan architectural pattern dalam pengembangan perangkat lunak adalah testablility yang jauh lebih tinggi dibandingkan tanpa menggunakan architectural pattern. Namun pada post sebelumnya (https://medium.com/@pplA2EDC/arsitektur-model-view-presenter-mvp-pada-aplikasi-android-cf4c4198b009), kita menggunakan asynchronous method dalam melakukan pembacaan database agar tampilan tidak frozen saat aplikasi sedang membaca database. Timbul masalah karena unit test sebuah method asynchronous tidak semudah method synchronous. Kita harus menyimulasikan model layer (data source) untuk melakukan callback terhadap business logic layer (presenter). Pada kesempatan kali ini, kita akan belajar untuk membuat unit test method pada presenter yang bersifat asynchronous menggunakan library Mockito.

Pertama-tama kita lihat kontrak view, presenter, dan data source-nya. Berikut adalah kontrak view dan presenter-nya

public interface RecipeContract {

interface View {
void setPresenter(Presenter presenter);
void showDishName(String dishName);
void showIngredients(String ingredients);
void showDirections(String directions);
void showEmptyRecipeError();
}

interface Presenter {
void start();
void setDishName(String dishName);
void setIngredients(String ingredients);
void setDirections(String directions);
}
}

Dan berikut adalah kontrak data source-nya

public interface RecipesDataSource {

interface GetRecipeCallback {
void onRecipeLoaded(Recipe recipe);
void onDataIsNotAvailable();
}

void getRecipe(String recipeId, GetRecipeCallback callback);
void setDishName(String recipeId, String dishName);
void setIngredients(String recipeId, String ingredients);
void setDirections(String recipeId, String directions);
}

Method pada presenter yang bersifat asynchronous adalah method yang harus memanggil method getRecipe() pada data source yaitu method start(). Dalam method start(), kita harus mengambil resep dari database dengan cara memanggil method getRecipe() pada data source, lalu detil resep yang sudah kita ambil harus kita tampilkan kepada pengguna dengan memanggil method showDishName(), showIngredients(), dan showDirections() pada view. Berikut adalah method untuk mengetes method start()

@Test
public void start() {
// Buat sebuah presenter. Masukkan "RESEP007" sebagai atribut
// recipeId presenter tersebut.
mRecipePresenter = new RecipePresenter("RESEP007",
mRecipesDataSource, mRecipeView);

// Panggil method yang akan dilakukan unit test
mRecipePresenter.start();

// Verifikasi bahwa presenter memanggil method getRecipe() pada
// data source dengan argumen "RESEP007". Capture callback yang
// nantinya akan digunakan untuk menyimulasikan asynchronous
// callback
verify(mRecipesDataSource).getRecipe(eq("RESEP007"),
mGetRecipeCallbackCaptor.capture());

// Simulasikan asynchronous callback yang mengembalikan Recipe
// dengan atribut dishName "rendang", ingredients "daging", dan
// directions "dimasak"
mGetRecipeCallbackCaptor.getValue().onRecipeLoaded(
new Recipe("rendang", "daging", "dimasak"));

// Verifikasi bahwa presenter memanggil method showDishName()
// pada view dengan argumen "rendang"
verify(mRecipeView).showDishName("rendang");

// Verifikasi bahwa presenter memanggil method showIngredients()
// pada view dengan argumen "daging"
verify(mRecipeView).showIngredients("daging");

// Verifikasi bahwa presenter memanggil method showDirections()
// pada view dengan argumen "dimasak"
verify(mRecipeView).showDirections("dimasak");
}

Pada kode di atas, kita menggunakan kelas ArgumentCaptor milik library Mockito untuk menyimulasikan callback ke presenter sebuah resep yang dapat kita tentukan sendiri atributnya.

Itulah cara melakukan testing method yang bersifat asynchronous menggunakan library Mockito. Sampai jumpa di post berikutnya!

--

--