MVVM + Clean Architecture Android projenizin modüllerini test etme Bölüm 1: Uygulamanızı oluşturma [Başlangıç]

Sabrina Cara
Huawei Developers - Türkiye
5 min readJul 1, 2022
Image Source: https://proandroiddev.com/navigation-events-in-mvvm-on-android-via-livedata-5c88ef48ee83

Merhaba arkadaşlar, bu sefer Android projenizi test etmeye yönelik bir makale dizisi ile geri döndüm. Bu yazı dizisinde, MVVM + Clean Architecture kullanarak bir Android projesi oluşturmayı hedefliyoruz (artık kim yapmıyor?). Basit android uygulamasını oluşturduktan sonra, UI testlerinden başlayarak her modülde view modelleri, use caseleri vb. gibi unit testlerine kadar projenin her modülünde testler yapacağız.

Giriş

Test, herhangi bir yazılım geliştirme sürecinin son derece önemli bir parçasıdır, çünkü bize projemizin işlevlerini çeşitli koşullar altında tamamen test etmeyi ve her bir test durumundan yeterli yanıt almayı öğretir. Bununla birlikte, bir yazılım geliştirme sürecinin, test sürecini de kolaylaştıran bir diğer önemli parçası, tüm geliştirme metodolojisinin kendisidir. Bununla, özellikle en iyi uygulamalardan kullanılan mimariye kadar kod kalitesini kastediyorum. Mimariden bahsetmişken, projenizi kodlamayı, debug ve test etmeyi kolaylaştıran mimarileri kullanmayı tercih ediyoruz. Bu belirli sebeplerden dolayı MVVM + Clean Architecture kullanmaya karar verdik.

Proje Geliştirme

Bu makale dizisinin ilk kısmı, projeyi gerçekten oluşturmak ve test için hazırlamaktır. Oluşturduğumuz proje basit bir Film Arama ve Film Detay ekranıdır. Bu projede, temel olarak bir film ararsınız ve sonuçlar bir RecyclerView’de görüntülenir. Recycler View’un herhangi bir öğesine tıklamak bizi seçtiğimiz filmin ayrıntılarına yönlendirir.

Bu projede kullanılan teknolojiler ve kavramlar şunlardır:

  • Kotlin
  • Clean Architecture
  • MVVM
  • Dependency Injection(Hilt)
  • Navigation Components
  • Retrofit / REST API
  • Data / ViewBinding
  • Coroutine

Bildiğiniz gibi, Clean Architecture projesinde üç genel modül vardır: app, data ve domain alanı.

App Modülü:

Uygulama modülümüz, viewler(Activity / Fragment) ve bunlara ait View Modelleri anlamına gelen bir kullanıcı arayüzünden oluşmaktadır. Bu projede MovieSearchFragment ve MovieDetailsFragment ve bunların ViewModel’leri var.

Film Arama

Film Arama Fragment, temel olarak, kullanıcının bir anahtar kelime girebileceği bir Arama View’u sunar. Kullanıcı tarafından girilen anahtar kelimeye dayanarak, anahtar kelimeyi ilettiğimiz ve karşılığında Filmlerin bir listesini ve temel bilgilerini aldığımız bir Film API çağırıyoruz.

Ek olarak, API’den alınan tüm sonuçları, filmlerin öğeler olarak temsil edildiği bir liste şeklinde uyarladığımız bir Recycler View’u ekledik.

Search ViewModel, usecase’i çağırır ve film aramasından elde ettiğimiz sonuçları toplar.

Film Detayları

Uygulamanın diğer view’u, RecyclerView üzerinde daha önce tıkladığımız belirli bir filmin ayrıntılarını gösteriyor. Bir fragment’ten diğerine geçiş sırasında filmin id’sini argüman olarak iletmek, bu id ile bir API çağrısı yapmayı mümkün kılar, bu da filmin ayrıntılarıyla sonuçlanır.

Details ViewModel ilgili usecase’in çağrısını yapar.

Domain Modülü:

Domain modülü, tüm iş bilgilerini ve veri modüllerini içeren Clean Architecture kullanan bir projenin iç katmanıdır.

Uygulama modülündeki ViewModules’tan domain modülündeki use caselerini çağırıyoruz.

Bu usecaseler aslında ilgili repository arayüzlerini enjekte eder ve Movies veya MovieDetails veri sınıfları gibi ilgili veri modüllerini döndürür.

Bu veri sınıfları nelerdir? Aslında, değişmesi muhtemel olmayan verileri içeren, güvenli ve bahsettiğimiz değişime karşı duyarlı olmayan şekilde kapsülleyen, projenin iş mantığıdır. API çağrılarımızın bize verdiği sonucu içerirler.

Onları nasıl yaratırız? API çağrısından beklediğimiz sonuçlara bağlı olarak, aslında bunları otomatik olarak oluşturabiliriz. Bir API çağrısı yaparken, çağrıyı yapmak için kullanacağınız bir URL’ye ihtiyacınız vardır. Bu tam URL’yi bir arama motoruna girerken, sonuçları normalde biçimlendirilmemiş bir JSON dosyası biçiminde alırsınız. Bu bilgiyi kopyalayın ve kaydedin, çünkü daha sonra ihtiyacımız olacak.

Android Studio IDE’nizde Settings’i açın, Plugins’e gidin ve ‘JSON to Kotlin’ eklentisine indirin. Ardından, domain modülünüzde sağ tıklayıp, New’i tıklayıp ardından yeni görünen JSON to Kotlin veri sınıfı seçeneğini belirleyebilirsiniz. URL’den biçimlendirilmemiş JSON dosyasını kopyalayıp yapıştırın, biçimlendirin ve ardından otomatik veri sınıfını oluşturun.

Kotlin to data class from JSON

Data Modülü:

Veri modülünde, arayüzleri domain modülünde bulunan repositorylerin uygulanması bulunuyor.

Bunun dışında, API çağrısının uç noktalarını oluşturan RetrofitClient Arayüzü ile birlikte DataSources ve arayüzlerine sahibiz.

interface MoviesListDataSource {    
suspend fun getMoviesList(keyword: String): Movies
}
interface MovieDetailsDataSource {
suspend fun getMovieDetails(movieId: Int): MovieDetails
}

Peki bu noktada iki ana sorunumuz var: Kullanım senaryoları repository arayüzlerini nasıl enjekte ediyor? ve Retrofit hizmetinin geri kalanını nasıl entegre ederiz?

Bu soruların her ikisini de açıklamak için basit bir terimden bahsetmemiz yeterli: Dependency Injections

Dependency Injections, belirli bir sınıf için bağımlılıkları manuel olarak oluşturmak yerine sağlamak, dolayısıyla kodun yeniden kullanılabilirliğini, testini ve genel olarak ‘best practice’ artırmak anlamına gelir.

Dependency Injectionslerini uygulama modülüne dahil ettim ve bunlar üç modülden oluşuyor:

Retrofit emplementasiyonunu içeren Network Modülü:

Repository enjeksiyonlarını içeren Repository Modülü:

Usecase enjeksiyonlarını içeren UseCase Modülü:

Sonuç

Yukarıdaki uygulamaların bir sonucu olarak, sonunda aşağıdaki gibi görünen en son teknolojileri kullanan basit bir entegre proje görebilirsiniz:

Şu anda, test edebileceğimiz uygun, basit bir projemiz var. Bir sonraki makalede, kullanım örneklerini ve davranışlarını test edeceğiz. Bizi takip etmeye devam edin!

İpuçlar

  • Projeye başlamadan önce Clean Architecture / MVVM / Dependency Injections vb. hakkında okuyun, kodlamaya atlamayın yoksa hiçbir şey anlamadan kopyala-yapıştır yapacaksınız.
  • Gradle dosyasına gerekli bağımlılıkları entegre etmeyi unutmayın.
    Her fragment ve view modelinden önce sırasıyla @AndroidEntryPoint ve @HiltViewModel eklemeyi unutmayın.
  • Daha önce sunulan eklentiyi kullanarak veri sınıflarınızı otomatik olarak oluşturmayı unutmayın.
  • Diğer bağımlılık ekleme modelleri ActivityRetainedComponent iken network bileşeni bir SingletonComponent sınıfıdır.

Sonuç

Bu yazı dizisinde, Clean Architecture + MVVM ve diğer birçok yeni teknoloji kullanılarak geliştirilen bir projenin tüm ayrı modüllerinde test metodolojilerini göstermeyi amaçlıyoruz. Ancak bu projenin her bir modülünü test edebilmek için önce projeyi oluşturup işlevsel hale getirmemiz gerekiyordu. Bir sonraki makalede, kullanım senaryosu testlerinin nasıl oluşturulacağını öğreneceksiniz. O zamana kadar sağlıklı kalın, harika kalın. Yakında görüşürüz arkadaşlar!

Referanslar

--

--