JUnit 5:如何在用 Kotlin 编写的测试中使用多个扩展?
JUnit 5: How do I use multiple extensions in a test written in Kotlin?
我正在尝试将 ViewModel
的测试从 JUnit 4 迁移到 JUnit 5,并结合使用 MockK。在 JUnit4 中,我在一个测试中使用了规则——即 RxJava2、LiveData 和协程的规则,并且效果很好。以下是我如何使用它们:
class CollectionListViewModelTest {
@get:Rule
val mockitoRule: MockitoRule = MockitoJUnit.rule()
@get:Rule
val taskExecutorRule = InstantTaskExecutorRule()
@get:Rule
val rxSchedulerRule = RxSchedulerRule()
@ExperimentalCoroutinesApi
@get:Rule
val coroutineRule = MainCoroutineRule()
@Mock
lateinit var getAllCollectionsUseCase: GetAllCollectionsUseCase
private lateinit var SUT: CollectionListViewModel
@Before
fun setUp() {
SUT = CollectionListViewModel(getAllCollectionsUseCase)
}
...
}
在尝试迁移到 JUnit5 时,我了解到规则现在是扩展,在搜索之后我拼凑了以前使用的规则的替换,并用 MockK 替换了 Mockito,我尝试用扩展替换规则以这种方式:
@ExperimentalCoroutinesApi
@Extensions(
ExtendWith(InstantExecutorExtension::class),
ExtendWith(MainCoroutineExtension::class),
ExtendWith(RxSchedulerExtension::class)
)
class CollectionListViewModelTest {
@MockK
lateinit var getAllCollectionsUseCase: GetAllCollectionsUseCase
private lateinit var SUT: CollectionListViewModel
@Before
fun setUp() {
MockKAnnotations.init(this)
SUT = CollectionListViewModel(getAllCollectionsUseCase)
}
...
但是,我收到一条错误消息,指出 getMainLooper
未被模拟,这与在 JUnit4 中不使用 InstantTaskExecutorRule 时遇到的错误相同:
java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
在 Junit5 中使用多个扩展的正确方法是什么?
我应该以这种方式使用 @ExtendWith
,而不是使用 @Extension
:
@ExtendWith(value = [InstantExecutorExtension::class, MainCoroutineExtension::class, RxSchedulerExtension::class])
或者更短的方式:
@ExtendWith(InstantExecutorExtension::class, MainCoroutineExtension::class, RxSchedulerExtension::class)
我正在尝试将 ViewModel
的测试从 JUnit 4 迁移到 JUnit 5,并结合使用 MockK。在 JUnit4 中,我在一个测试中使用了规则——即 RxJava2、LiveData 和协程的规则,并且效果很好。以下是我如何使用它们:
class CollectionListViewModelTest {
@get:Rule
val mockitoRule: MockitoRule = MockitoJUnit.rule()
@get:Rule
val taskExecutorRule = InstantTaskExecutorRule()
@get:Rule
val rxSchedulerRule = RxSchedulerRule()
@ExperimentalCoroutinesApi
@get:Rule
val coroutineRule = MainCoroutineRule()
@Mock
lateinit var getAllCollectionsUseCase: GetAllCollectionsUseCase
private lateinit var SUT: CollectionListViewModel
@Before
fun setUp() {
SUT = CollectionListViewModel(getAllCollectionsUseCase)
}
...
}
在尝试迁移到 JUnit5 时,我了解到规则现在是扩展,在搜索之后我拼凑了以前使用的规则的替换,并用 MockK 替换了 Mockito,我尝试用扩展替换规则以这种方式:
@ExperimentalCoroutinesApi
@Extensions(
ExtendWith(InstantExecutorExtension::class),
ExtendWith(MainCoroutineExtension::class),
ExtendWith(RxSchedulerExtension::class)
)
class CollectionListViewModelTest {
@MockK
lateinit var getAllCollectionsUseCase: GetAllCollectionsUseCase
private lateinit var SUT: CollectionListViewModel
@Before
fun setUp() {
MockKAnnotations.init(this)
SUT = CollectionListViewModel(getAllCollectionsUseCase)
}
...
但是,我收到一条错误消息,指出 getMainLooper
未被模拟,这与在 JUnit4 中不使用 InstantTaskExecutorRule 时遇到的错误相同:
java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
在 Junit5 中使用多个扩展的正确方法是什么?
我应该以这种方式使用 @ExtendWith
,而不是使用 @Extension
:
@ExtendWith(value = [InstantExecutorExtension::class, MainCoroutineExtension::class, RxSchedulerExtension::class])
或者更短的方式:
@ExtendWith(InstantExecutorExtension::class, MainCoroutineExtension::class, RxSchedulerExtension::class)