Я пытаюсь выполнить модульное тестирование класса репозитория в 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
Модульное тестирование репозитория с подкачкой 3 с использованием удаленного посредника и источника подкачки. ⇐ Android
Форум для тех, кто программирует под Android
1727507615
Anonymous
Я пытаюсь выполнить модульное тестирование класса репозитория в Android, который использует подкачку с помощью удаленного посредника и источника подкачки.
Но когда я запускаю тест, возвращаемый результат оказывается пустым, хотя фактическое значение должно содержать тестовый элемент.
Как показано ниже:
[b]Вот мой репозиторий[/b]
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() }
}
}
}
[b]Вот мой UT[/b]
@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))
}
}
}
}
[b]Вот FakeApi, FakePagingSource и FakeDao[/b]
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)
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/66503911/unit-testing-a-repository-with-paging-3-using-a-a-remote-mediator-and-paging-sou[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия