[英]Accessing Common Coroutine Rule From All Modules - Android Unit Test
我有一個TestWatcher
class 實現TestCoroutineScope
接口如下:
@ExperimentalCoroutinesApi
class MainCoroutineRule(private val dispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()) :
TestWatcher(),
TestCoroutineScope by TestCoroutineScope(dispatcher) {
override fun starting(description: Description?) {
super.starting(description)
Dispatchers.setMain(dispatcher)
}
override fun finished(description: Description?) {
super.finished(description)
cleanupTestCoroutines()
Dispatchers.resetMain()
}
}
這用於使用 kotlin 協程向ViewModelTest
提供 Loopers,例如:
@RunWith(JUnit4::class)
class BlaViewModelTest {
@get:Rule
val instantExecutorRule = InstantTaskExecutorRule()
@ExperimentalCoroutinesApi
@get:Rule
val coroutineRule = MainCoroutineRule()
@MockK
lateinit var blaUseCase: BlaUseCase
private lateinit var blaViewModel: BlaViewModel
@Before
fun setup() {
MockKAnnotations.init(this)
blaViewModel = BlaViewModel(blaUseCase)
}
@Test
fun testBla_Positive() {
coEvery {
blaUseCase.execute(any()).await()
} returns Resource.Success(Bla("data"))
blaViewModel.blaLiveData.observeForever {}
blaViewModel.bla()
assert(blaViewModel.blaLiveData.value != null)
assert(blaViewModel.blaLiveData.value is Resource.Success)
assert((blaViewModel.blaLiveData.value as? Resource.Success)?.value?.data == "data")
}
}
我的問題是我只能從保留BlaViewModelTest
的同一模塊測試目錄訪問MainCoroutineRule
。
如果我將MainCoroutineRule
移動到公共模塊中的測試目錄,比方說base
, BlaViewModelTest
在測試運行時最終失敗期間無法訪問MainCoroutineRule
。 編譯時沒有問題。
我試圖將MainCoroutineRule
移動到base
的 main package 中,但它迫使我在項目中實現測試庫,從我的角度來看這不是一個好方法。
我不想為所有模塊復制MainCoroutineRule
,我想從公共源訪問它。
任何方法將不勝感激。
如果我將
MainCoroutineRule
移動到公共模塊中的測試目錄,比方說base
,BlaViewModelTest
在測試運行時最終失敗期間無法訪問MainCoroutineRule
。 編譯時沒有問題。
測試源在消費者模塊中不可用。 我不知道為什么它們在編譯時可用以及為什么 IDE 不抱怨它,但我確實經歷過同樣的事情。
要解決這個問題,您可以創建一個單獨的僅測試模塊(例如base-testing
、 test-utils
)。 該規則應該是模塊正常來源的一部分( src/main
,而不是src/test
)。 然后您可以將該模塊作為testImplementation
在您的消費者模塊中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.