簡體   English   中英

從所有模塊訪問公共協程規則 - Android 單元測試

[英]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移動到公共模塊中的測試目錄,比方說baseBlaViewModelTest在測試運行時最終失敗期間無法訪問MainCoroutineRule 編譯時沒有問題。

我試圖將MainCoroutineRule移動到base的 main package 中,但它迫使我在項目中實現測試庫,從我的角度來看這不是一個好方法。

我不想為所有模塊復制MainCoroutineRule ,我想從公共源訪問它。

任何方法將不勝感激。

如果我將MainCoroutineRule移動到公共模塊中的測試目錄,比方說baseBlaViewModelTest在測試運行時最終失敗期間無法訪問MainCoroutineRule 編譯時沒有問題。

測試源在消費者模塊中不可用。 我不知道為什么它們在編譯時可用以及為什么 IDE 不抱怨它,但我確實經歷過同樣的事情。

要解決這個問題,您可以創建一個單獨的僅測試模塊(例如base-testingtest-utils )。 該規則應該是模塊正常來源的一部分( src/main而不是src/test )。 然后您可以將該模塊作為testImplementation在您的消費者模塊中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM