如何解决使用涡轮机测试协程StateFlow的更好方法是什么
我正在寻找一种更好的方式来测试协程。目前,我使用 Turbine 作为测试助手。但是,我在改进超时问题时遇到了一些困难。
例如:
class RepositoryTest {
@get:Rule
val rule = InstantTaskExecutorRule()
private lateinit var sut: SubjectToTest
private val testdispatchers = TestdispatchersProvider.dispatchers
private val mockAddressRepository = mockk<AddressRepository>(relaxed = true)
private val mockApiService = mockk<ApiService>(relaxed = true)
private val mockCardsRepository = mockk<CardsRepository>(relaxed = true)
@Before
fun setup() {
sut = SutRepository(
apiService = mockApiService,dispatchersProvider = testdispatchers,restCallHandler = testRestCallHandler,addressRepo = mockAddressRepository,cardRepo = mockCardsRepository,)
}
@After
fun tearDown() {
unmockkAll()
}
private val mockCardResponse = CardResponse(
data = DataModel(
listof(
...
)
)
)
@Test
fun `fetchData has success response then return Data`() = runBlockingTest {
// Given
coEvery {
mockAddressService.fetchAddresss(any(),any(),any())
} returns Response.success(mockCardResponse)
every {
mockCardsRepository.fetchCard
} returns mockFlow()
testRestCallHandler.callResult = ...
// Test
sut.fetchMessages(true)
sut.StateFlow.test {
expectItem().assertObject{ ... }
expectItem().assertSize(1)
}
}
}
上面的代码有TimeoutCancellationException。
kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 1000 ms
at |b|b|b(Coroutine boundary.|b(|b)
通过解决上述问题,我在测试中移动了类的初始化。
@Test
fun `fetchData has success response then return Data`() = runBlockingTest {
// Given
coEvery {
mockAddressService.fetchAddresss(any(),any())
} returns Response.success(mockCardResponse)
every {
mockCardsRepository.fetchCard
} returns mockFlow()
testRestCallHandler.callResult = ...
// Test
sut = SutRepository(
apiService = mockApiService,)
sut.fetchMessages(true)
sut.StateFlow.test {
expectItem().assertType<List<DataMode;>> {
this.assertListSize(1)
}
cancel()
}
}
在测试中移动初始化后,测试通过,但我正在寻找改进方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。