Skip to content

Instantly share code, notes, and snippets.

@seoft
Last active November 30, 2019 06:20
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 seoft/d0f7f5d92cd3df285da0ceef2ab2b304 to your computer and use it in GitHub Desktop.
Save seoft/d0f7f5d92cd3df285da0ceef2ab2b304 to your computer and use it in GitHub Desktop.
package kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock
import android.content.Context
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.BookRepo
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.api.createGsonFactory
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.api.createOkHttpFactory
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.api.createWebService
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.local.PrefRepo
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.model.Book
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.ui.main.MainActivity
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.ui.main.MainVM
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.ui.sub.SubVM
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.util.get
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import java.sql.Timestamp
/**
* ref :
* https://www.slideshare.net/imkimkevin/android-jetpack-viewmodel-and-testing
* https://medium.com/pxhouse/unit-testing-with-mutablelivedata-22b3283a7819
* https://bonoogi.postype.com/post/3514910
* https://mvnrepository.com/artifact/androidx.arch.core/core-testing/2.0.0-alpha1
* https://eclipse-owl.tistory.com/8
*/
@RunWith(AndroidJUnit4::class)
class ViewModelTest {
val DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
@JvmField
@Rule
val main = ActivityTestRule(MainActivity::class.java)
@JvmField
@Rule
val instantTaskExecutorRule = InstantTaskExecutorRule()
lateinit var context: Context
lateinit var mainVM: MainVM
lateinit var subVM: SubVM
var callbackOrder = 0
fun <T> LiveData<T>.observeByOrder(observer: Observer<T>, _order: Int) {
if (_order != callbackOrder) return
observeForever(object : Observer<T> {
override fun onChanged(t: T?) {
observer.onChanged(t)
removeObserver(this)
callbackOrder++
}
})
}
@Before
fun setUp() {
context = main.activity
mainVM = MainVM(PrefRepo(context))
subVM = SubVM(
BookRepo(
createWebService(
createOkHttpFactory(),
createGsonFactory(DATE_FORMAT),
BuildConfig.BASE_URL
), BuildConfig.AUTH_KEY
)
)
}
@Test
fun testMainVM() {
// clickSearch
var latelyStr: String? = null
mainVM.clickSearch("")
assertEquals(latelyStr, mainVM.doSearch.value)
val keyword = "테스트"
mainVM.clickSearch(keyword)
assertEquals(keyword, mainVM.doSearch.get())
latelyStr = keyword
mainVM.clickSearch("")
assertEquals(latelyStr, mainVM.doSearch.get())
// calc
val myBook1 = Book(
arrayListOf("aut1", "aut2"),
"this_is_contents",
Timestamp(System.currentTimeMillis()),
1000,
800,
"this_is_title"
)
mainVM.calc(myBook1)
assertEquals(-800, mainVM.balance.get())
val myBook2 = Book(
arrayListOf("aut1", "aut2"),
"this_is_contents",
Timestamp(System.currentTimeMillis()),
1000,
900,
"this_is_title"
)
mainVM.calc(myBook2)
assertEquals(100, mainVM.balance.get())
}
@Test
fun testSubVM() {
val abcTestKeywrod = "abc"
val androidTestKeyword = "android"
val rxjavaTestKeyword = "rxjava"
// check init value
assertEquals(1, subVM.page)
assertEquals(1, subVM.refreshCount)
// search abc
subVM.addData(abcTestKeywrod)
subVM.doRefresh.observeByOrder(Observer {
assertEquals(11, subVM.books.size)
assertEquals(2, subVM.page)
subVM.books.forEach {
if(it is Book) assertEquals(true, it.title.contains(Regex("(?i)abc")))
}
// search android
subVM.addData(androidTestKeyword)
}, 0)
subVM.doRefresh.observeByOrder(Observer {
assertEquals(21, subVM.books.size)
assertEquals(3, subVM.page)
subVM.books.forEach {
if(it is Book) assertEquals(true, it.title.contains(Regex("(?i)android")))
}
// search rxjava
subVM.addData(rxjavaTestKeyword)
}, 1)
subVM.doRefresh.observeByOrder(Observer {
assertEquals(31, subVM.books.size)
assertEquals(4, subVM.page)
subVM.books.forEach {
if(it is Book) assertEquals(true, it.title.contains(Regex("(?i)rxjava")))
}
// cleared list
subVM.clearBooks()
assertEquals(1, subVM.page)
assertEquals(1, subVM.refreshCount)
assertEquals(1, subVM.books.size)
}, 2)
}
@Test
fun testSubVM2() {
val emptyResultTestKeyword = "34[@?&*vf2narㄱ㈜tyi2q[ac!@()vs"
assertEquals(1, subVM.page)
assertEquals(1, subVM.refreshCount)
subVM.addData(emptyResultTestKeyword)
subVM.doEmptyData.observeForever {
assertEquals(1, subVM.page)
assertEquals(1, subVM.books.size)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment