Tag: 单元测试

如何管理Kotlin中的单元测试资源,如启动/停止数据库连接或嵌入式elasticsearch服务器?

在我的Kotlin JUnit测试中,我想启动/停止嵌入式服务器,并在我的测试中使用它们。 我试着在我的测试类的方法上使用JUnit @Before注释,它工作正常,但它不是正确的行为,因为它运行每个测试用例,而不是一次。 因此,我想在一个方法上使用@BeforeClass注解,但是将其添加到方法中会导致错误,说明它必须是静态方法。 Kotlin似乎没有静态的方法。 然后这同样适用于静态变量,因为我需要在测试用例中保留对嵌入式服务器的引用。 那么,如何为我的所有测试用例创建这个嵌入式数据库? class MyTest { @Before fun setup() { // works in that it opens the database connection, but is wrong // since this is per test case instead of being shared for all } @BeforeClass fun setupClass() { // what I want to do instead, but results in […]

如何从java测试代码访问内部属性

我已经有了一些有财产标记为内部的类。 然后我尝试从java中的测试代码中设置属性。 我怎样才能访问这些属性? 测试代码和类代码都在同一个包中。 例: class MainActivity : AppCompatActivity() { interal var someProperty = "test" } 测试代码: @Test public void firstStartTest() { val activity = MainActivity() activity.setSomeProperty("something") //does not compile } Android Studio建议使用activity.setSomeProperty $ production_sources_for_module_app(); 但是这也不能编译。

单元测试室和LiveData

我目前正在开发一个应用程序使用新的Android架构组件 。 具体来说,我正在实现一个房间数据库,在其中一个查询返回一个LiveData对象。 插入和查询按预期工作,但我有一个问题,使用单元测试测试查询方法。 这是我试图测试的DAO: NotificationDao.kt @Dao interface NotificationDao { @Insert fun insertNotifications(vararg notifications: Notification): List<Long> @Query("SELECT * FROM notifications") fun getNotifications(): LiveData<List<Notification>> } 正如你所看到的,查询函数返回一个LiveData对象,如果我改变这只是一个List , Cursor或基本上无论如何我得到预期的结果,这是数据库中插入的数据。 问题是,以下测试总是失败,因为LiveData对象的值始终为null : NotificationDaoTest.kt lateinit var db: SosafeDatabase lateinit var notificationDao: NotificationDao @Before fun setUp() { val context = InstrumentationRegistry.getTargetContext() db = Room.inMemoryDatabaseBuilder(context, SosafeDatabase::class.java).build() notificationDao = db.notificationDao() } @After […]

在Mockito类的模拟过程中投射参数

当我用下面的方法(在Kotlin中) val card: Card = mock<Card>()模拟类时val card: Card = mock<Card>()它会自动将所有参数(cardNumber,expMonth,expYear,CVC)初始化为String,因为它们保存为String。 然而,在我要测试的代码(Java)中,我通过以下方式初始化类卡 Card card = new Card(mView.getCreditCardNumber(), Integer.valueOf(mView.getMonth()), Integer.valueOf(mView.getYear()), mView.getCVV()); 我已经用以下方式嘲笑了这些价值 whenever(mView.creditCardNumber).then { "1234567890123456" } whenever(mView.month).then { "12" } whenever(mView.year).then { "2022" } whenever(mView.cvv).then { "123" } 所以区别在于中间的2个参数应该是整数,而我不能这样做。 我尝试了以下解决方案 whenever(mView.month).then { 12 } whenever(mView.year).then { 2022 } 但是我从Int到String得到CastException。 由于mView.month /年应该是字符串。 那么,有没有办法使这个强制转换,否则我不能够正确地测试代码的其余部分。 请帮忙,否则我疯了。 谢谢 :) !

在Spock单元测试中,模拟方法没有被调用

我试图使用Spock框架来实现单元测试,这是我的测试看起来像: def setup() { scrollableResultsMock = Mock(ScrollableResults) paymentRepositoryMock = Mock(PaymentRepository) paymentRegistryService = new PaymentRegistryService(paymentRepositoryMock) } @Unroll def 'should correctly process'() { given: paymentRepositoryMock.findUnconfirmedTransactions(_ as LocalDate, _ as Days) >> scrollableResultsMock … } 这里是我试图注入嘲笑对象的类: @Service open class PaymentRegistryService @Autowired constructor( val paymentRepository: PaymentRepository ) { @Transactional open fun parseRegistryFileStream(input: InputStream): LinkedList<Pair<Long, String>> { … val registry […]

与Kotlin测试异步失败的Mockito

我正在尝试为我的测试学习Mockito,但使用Kotlin时则更加复杂。 我想在我的演示者中测试一个函数,当调用者从存储库异步获取对象列表并从侦听器触发Success / onError时。 之后,主持人根据回调告诉视图做任何事情。 以下是测试代码: @Mock lateinit var view: CategoriesActivityContract.View @Mock lateinit var repository: CategoriesRepository @Before fun setUp() { MockitoAnnotations.initMocks(this) } @Test fun shouldPassCategoriesToView2() { `doAnswer`({ it: InvocationOnMock? -> (it!!.arguments[0] as CategoriesRepository.OnGetCategoriesListener).onSuccess(DUMMY_CATEGORIES) null }).`when`(repository).getCategoriesAsync(any(CategoriesRepository.OnGetCategoriesListener::class.java)) val presenter: CategoriesActivityPresenter = CategoriesActivityPresenter(repository) presenter.bindView(view) presenter.loadCategories() `verify`(view).displayCategories(DUMMY_CATEGORIES) } 这是测试的代码: override fun loadCategories() { repository.getCategoriesAsync(object: CategoriesRepository.OnGetCategoriesListener { override fun onSuccess(categories: […]

我应该如何测试Kotlin扩展功能?

有人能告诉我如何在Kotlin中单元测试扩展函数吗? 由于它们是静态解析应该作为静态方法调用还是非静态? 另外,由于语言与Java是完全可互操作的,因此Java单元如何测试Kotlin扩展函数应该如何执行?

Robolectric与AppCompat Library不兼容的AlertDialog问题

我的应用程序有Robolectric框架测试的Android Alertdialog。 ShadowAlertDialog.getLatestAlertDialog() 但是,现在该AlertDialog更改为android.support.v7.app.AlertDialog,因为Robolectric给我一个不兼容的类型错误。 Error:(81, 50) error: incompatible types required: android.support.v7.app.AlertDialog found: android.app.AlertDialog 我该如何解决这个问题?

如何获得不同的单元和instrumentationTests为Android的顶级功能的实现

我有一个顶级功能的kotlin文件(不是任何类的成员)。 它编译为Java中的静态函数类。 我想为单元测试(独立于平台)和仪器测试(生产行为+ Espresso Idling Resource)提供不同的函数实现。 我可以把同一个文件放在prod和测试的相同路径中,但是当我把它放到测试中,androidTest – IDE在一个源文件集中看到它,并且无法解析我想要使用的函数。 由于我使用的是顶级函数,因此我不能使用DI将不同的实现传递给测试类。 是否有任何不同的测试和androidTest顶级功能的类的实现? 我试过了 sourceSets { androidTest { java.srcDirs = ['src/androidTest/java'] java.exclude('src/test/java/util/CoroutinesUi.kt') } test { java.srcDirs = ['src/test/java'] } } 没有运气。

在RxAndroid用例的演示者中测试什么以及如何测试

我的项目使用干净的架构 。 我用: 表示层的MVP 使用使用RxAndroid并获得DisposableObservers的案例 DI的匕首2 来自演示者(Kotlin)的示例代码: fun doSomething() { getInterestingDataUseCase.execute(object : DisposableObserver<List<InterestingDataItem>>() { override fun onStart() { view.showLoadingIndicator() } override fun onNext(dataList: List<InterestingDataItem>) { view.showDataItems(dataList) } override fun onError(e: Throwable) { view.showErrorDialog() } override fun onComplete() { view.hideLoadingIndicator() } }) } 我想为这个主持人编写单元测试。 我的问题是:在DisposableObserver不同的方法调用值得测试(onStart,onNext …)? 如果是这样的话,看起来好像我需要将DisposableObserver注入主持人(这样我就可以嘲笑它)。 有更清洁的方法吗?