У меня возникла ошибка при создании модульного теста для общей функции в Kotlin AndroidAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 У меня возникла ошибка при создании модульного теста для общей функции в Kotlin Android

Сообщение Anonymous »

У меня есть универсальная функция в классе ConsumptionRepository:

Код: Выделить всё

fun  getConsumptionData(
beginDate: Date,
endDate: Date,
id: String,
transformation: (List, String) -> List,
filterCriteria: (List) -> List,
finalMapping: ((T) -> R)? = null,
getOtherData: () -> Flowable
): Flowable {
return FIRST_REPOSITORY.getStatus()
.asFlowable()
.flatMap { status ->
if (status.isAvailable) {
getMainData(beginDate, endDate, id)
.map { entities ->
var transformedData =
transformation(entities, id)
transformedData = filterCriteria.invoke(transformedData)
(if (finalMapping != null) transformedData.map(finalMapping) else transformedData)
.filterNotNull()
}
} else {
getOtherData()
}
}
.onErrorReturn { emptyList() }
}
где getMainData и может быть упрощено

Код: Выделить всё

fun getMainData(
beginDate: Date,
endDate: Date,
tradeAgreementId: String
): Flowable {
return SECOND_REPOSITORY
.getAll(
beginDate, endDate
).asFlowable()
}
FIRST_REPOSITORY и SECOND_REPOSITORY (названия в верхнем регистре, чтобы сделать их более читабельными) вводятся в мой класс с помощью Koin.
Когда я хочу протестировать getConsumptionData , у меня возникла проблема с getMainData, она не очень хорошо высмеивается.

Код: Выделить всё

class ConsumptionRepositoryTest {

private lateinit var repository: ConsumptionRepository
private lateinit var firstRepository: FakeFirstRepository
private lateinit var secondRepository: FakeSecondRepository

@get:Rule
val koinTestRule = KoinTestRule.create {
modules(
module {
factoryOf(::FakeFirstRepository)
factoryOf(::FakeSecondRepository)
})
}

@OptIn(ExperimentalCoroutinesApi::class)
@BeforeTest
fun setUp(): Unit = runTest {
Dispatchers.setMain(UnconfinedTestDispatcher())
repository =
ConsumptionRepository()
firstRepository = FakeFirstRepository()
secondRepository = FakeSecondRepository()
}

@OptIn(ExperimentalCoroutinesApi::class)
@AfterTest
fun tearDown() = runTest {
Dispatchers.resetMain()
}

@Test
fun `returns transformed and filtered data when status is available`() = runTest {
// GIVEN
val beginDate = Date(1609459200000)
val endDate = Date(1640995200000)
val id = "id"

val transformation: (List, String) -> List =
{ entities, _ ->
fakeTranformedEntities
}

val filterCriteria: (List) -> List =
{ entities ->
fakeTranformedEntities.subList(0, 1)
}

val getOtherData: () -> Flowable = {
Flowable.just(
emptyList()
)
}

val result = repository.getConsumptionData(
beginDate = beginDate,
endDate = endDate,
id = id,
transformation = transformation,
filterCriteria = filterCriteria,
getOtherData = getOtherData
).toList().blockingGet() as List

val expectedData = fakeTranformedEntities.subList(0, 1)
assertEquals(expectedData, result)
}
когда я выполняю тест, у меня всегда возникает ошибка: не найдено определение для типа «package.SecondRepository». Проверьте конфигурацию своих модулей и добавьте недостающий тип и/или квалификатор!. Итак, я создал fakeConsumptionRepository с помощью метода getMainData, который возвращает Flowable определенный список Entity, но у меня все еще есть ошибка. Как будто не использовался фейковый getMainData. Для меня нет причин вызывать SecondReposity.
Раньше я пробовал использовать библиотеку Mockk вместо поддельных данных, и у меня была та же проблема, в то время как с firstRepository у меня нет проблем.
Помогите мне, пожалуйста!!!
Спасибо

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

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

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

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

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

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

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