250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 안드로이드
- Compose
- livedata
- scroll
- TEST
- Button
- Dialog
- Coroutines
- drift
- viewmodel
- Kotlin
- data
- 앱바
- DART
- textview
- binding
- 계측
- CustomScrollView
- Flutter
- tabbar
- 테스트
- activity
- intent
- 앱
- Navigation
- ScrollView
- textfield
- android
- appbar
- LifeCycle
Archives
- Today
- Total
Study Record
[안드로이드] 단위 테스트 참고사항 본문
728x90
😶 gradle dependencies
testImplementation 'junit:junit:4.+'
testImplementation 'androidx.arch.core:core-testing:2.1.0'
😶 LiveData Object 테스트하기
특별한 명시가 없다면, 단위 테스트에서는 모든 것이 메인 스레드(=UI 스레드)에서 실행되는 것으로 가정한다. LiveData 는 값이 변경되는 즉시 UI를 업데이트하는데 UI는 메인 스레드(=UI 스레드)에서 업데이트되어야 한다. 하지만 LiveData 는 메인 스레드에서 엑세스할 수 없기 때문에 메인 스레드를 호출하면 안 된다고 명시해야 한다. 명시는 다음과 같다.
class ViewModelTests {
@get:Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
}
만약, TestViewModel 클래스가 다음과 같다고 하자.
class TestViewModel : ViewModel() {
private val _quantity: MutableLiveData<Int> = MutableLiveData(0)
val quantity: LiveData<Int>
get() = _quantity
private val _price: MutableLiveData<Int> = MutableLiveData(0)
val price: LiveData<Int>
get() = _price
val priceString: LiveData<String> = Transformations.map(_price) {
"${it}원"
}
fun setQuantity(newQuantity: Int) {
_quantity.value = newQuantity
updatePrice()
}
private fun updatePrice() {
_price.value = (_quantity.value ?: 0) * 100
}
}
setQuantity() 로 _quantity 값을 변경하면 updatePrice() 함수가 실행되 _price 값도 변경된다.
이 TestViewModel 을 테스트는 다음과 같이 할 수 있다.
class ViewModelTests {
@get:Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
@Test
fun quantity_twelve_cupcakes(){
val viewModel = TestViewModel()
viewModel.setQuantity(12)
assertEquals(12, viewModel.quantity.value)
assertEquals(12 * 100, viewModel.price.value)
}
}
Transformation.map() 함수가 포함된 LiveData 인 priceString 을 테스트하려면 LiveData 개체 값을 테스트할 때 변경 사항을 표시하기 위해 개체를 관찰해야 한다. 이것은 간단하게 observeForever 메서드를 사용하면 된다. 이부분을 포함하여 나머지 priceString 을 테스트 코드는 다음과 같다.
class ViewModelTests {
@get:Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
@Test
fun quantity_twelve_cupcakes(){
val viewModel = TestViewModel()
viewModel.priceString.observeForever {}
viewModel.setQuantity(15)
assertEquals(15, viewModel.quantity.value)
assertEquals(15 * 100, viewModel.price.value)
assertEquals("${15 * 100}원", viewModel.priceString.value)
}
}
728x90
'안드로이드' 카테고리의 다른 글
[안드로이드] Retrofit 살펴보기 (ViewModel, Moshi, coroutines) (0) | 2023.08.09 |
---|---|
[안드로이드] SlidingPaneLayout 살펴보기 (0) | 2023.08.03 |
[안드로이드] Task 와 Back Stack (0) | 2023.08.02 |
[안드로이드] LiveData 참고사항 (0) | 2023.08.02 |
[안드로이드] 데이터 바인딩(Data Binding) 참고사항 (0) | 2023.08.02 |