Модульное тестирование репозитория с подкачкой 3 с использованием удаленного посредника и источника подкачки.Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Модульное тестирование репозитория с подкачкой 3 с использованием удаленного посредника и источника подкачки.

Сообщение Anonymous »

Я пытаюсь выполнить модульное тестирование класса репозитория в Android, который использует подкачку с помощью удаленного посредника и источника подкачки.
Но когда я запускаю тест, возвращаемый результат оказывается пустым, хотя фактическое значение должно содержать тестовый элемент.
Как показано ниже:
Вот мой репозиторий
class PostsRepository @Inject constructor(
private val postsApi: AutomatticPostsApi,
private val postsDao: PostDao
) : IPostsRepository {

@ExperimentalPagingApi
override fun loadPosts(): Flow
> {
println("loadPosts")
return Pager(
config = PagingConfig(20),
initialKey = 1,
remoteMediator = PostsPageRemoteMediator(
postsApi,
postsDao
),
pagingSourceFactory = { postsDao.getPostsPagingSource() }
).flow.map { pagingData ->
pagingData.map { it.toPost() }
}
}

}

Вот мой UT
@ExperimentalCoroutinesApi
@ExperimentalPagingApi
class PostsRepositoryTest {
@get:Rule
val instantTaskExecutorRule = InstantTaskExecutorRule()

private val coroutineDispatcher = TestCoroutineDispatcher()
private lateinit var postDao: FakePostDao
private lateinit var postsApi: CommonAutomatticPostsApi
private val remotePosts = listOf(createDummyPostResponse())
private val domainPosts = remotePosts.map { it.toPost() }

//GIVEN: subject under test
private lateinit var postsRepository: PostsRepository

@Before
fun createRepository() = coroutineDispatcher.runBlockingTest {
postsApi = CommonAutomatticPostsApi(remotePosts.toMutableList())
postDao = FakePostDao()
postsRepository = PostsRepository(postsApi, postDao)
}

@Test
fun loadPosts_returnsCorrectPosts() = runBlockingTest {
//WHEN: posts are retrieved from paging source

launch {

postsRepository.loadPosts().collect { pagingData ->

val posts = mutableListOf
()
pagingData.map {

posts.add(it)
println(it)
}

//THEN: retrieved posts should be the remotePosts
assertThat(posts, IsEqual(domainPosts))
}

}

}
}

Вот FakeApi, FakePagingSource и FakeDao
class CommonAutomatticPostsApi(val posts: MutableList = mutableListOf()) : AutomatticPostsApi {
companion object {
const val SUBSCRIBER_COUNT = 2L
const val AUTHOR_NAME = "RR"
}

override suspend fun loadPosts(page: Int, itemCount: Int): PostsResponse {
println("Loaded")
return PostsResponse(posts.size.toLong(), posts)
}
}

class FakePostsPagingSource() : PagingSource() {
var triggerError = false
var posts: List = emptyList()
set(value) {
println("set")
field = value
invalidate()
}

override suspend fun load(params: LoadParams): LoadResult {
println("load")
if (triggerError) {
return LoadResult.Error(Exception("A test error triggered"))
}
println("not error")

return LoadResult.Page(
data = posts,
prevKey = null,
nextKey = null
)
}

override fun getRefreshKey(state: PagingState): Int? {
println("refresh")

return state.anchorPosition ?: 1
}
}

class FakePostDao(val posts: MutableList = mutableListOf()) : PostDao {
val pagingSource = FakePostsPagingSource()

override suspend fun insertPosts(posts: List) {
this.posts.addAll(posts)
println("insertPosts")
updatePagingSource()
}

override suspend fun updatePost(post: PostEntity) {
onValidPost(post.id) {
posts[it] = post
updatePagingSource()
}
}

private fun onValidPost(postId: Long, block: (index: Int) -> Unit): Boolean {
println("onValidPost")

val index = posts.indexOfFirst { it.id == postId }
if (index != -1) {
block(index)
return true
}

return false
}

override suspend fun updatePost(postId: Long, subscriberCount: Long) {
onValidPost(postId) {
posts[it] = posts[it].copy(subscriberCount = subscriberCount)
updatePagingSource()
}
}

override suspend fun getPostById(postId: Long): PostEntity? {
val index = posts.indexOfFirst { it.id == postId }
return if (index != -1) {
posts[index]
} else {
null
}
}

override suspend fun getPosts(): List {
println("getPosts")

return posts
}

override fun getPostsPagingSource(): PagingSource {
println("getPostsPagingSource")

return pagingSource
}

override suspend fun clearAll() {
posts.clear()
updatePagingSource()
}

private fun updatePagingSource() {
println("updatePagingSource")

pagingSource.posts = posts
}

@Transaction
override suspend fun refreshPosts(newPosts: List) {
println("refreshPosts")
clearAll()
insertPosts(newPosts)
}
}


Подробнее здесь: https://stackoverflow.com/questions/665 ... paging-sou
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»