Android 单元测试,以检查在使用RxBindings时是否调用了accept
我编写了一个单元测试,用于测试是否调用了使用jakeWartons rxBindings的PublishRelay accept 这是我正在测试的代码片段Android 单元测试,以检查在使用RxBindings时是否调用了accept,android,unit-testing,rx-java2,rx-binding,Android,Unit Testing,Rx Java2,Rx Binding,我编写了一个单元测试,用于测试是否调用了使用jakeWartons rxBindings的PublishRelay accept 这是我正在测试的代码片段 AS 4.0.2 RxBindings 4.0.0 非常感谢您的建议,您绝对不应该致电relay。请在测试中直接接受。应在subscribeBy中代表您调用accept。该问题基于.debounce运算符 Debounce等待给定的时间,如果没有后续的“发射视图”单击,它会将项目向下游发射到.subscribeBy中。这会造成一些延迟并导致
AS 4.0.2
RxBindings 4.0.0
非常感谢您的建议,您绝对不应该致电relay。请在测试中直接接受。应在subscribeBy中代表您调用accept。该问题基于.debounce运算符 Debounce等待给定的时间,如果没有后续的“发射视图”单击,它会将项目向下游发射到.subscribeBy中。这会造成一些延迟并导致测试失败,因为在传递click emit之前调用了actual.assertValueUnit 您可以通过以下方法解决此问题。debounce操作符的执行是在当前线程上立即完成的,因此您基本上将处理项目交付到中继并在之后运行断言 我已将您的示例简化了一点,但我希望重点仍然是: 类别SO64328289{ val checkStoresRelay:Relay=PublishRelay.create 趣味onCheckStockTappedview:查看{ 点击查看 .debounce1,TimeUnit.ms .订阅人 onNext=checkStoresRelay::accept, onError={Log.eSO64328289,it.localizedMessage} } } @RunWithRobolectrictTestRunner::类 @Configsdk=[28] 类SO64328289测试{ @get:Rule val schedulerRule=RxSchedulerRule @试验 乐趣`当点击按钮时,继电器发出值`{ val测试=SO64328289 val view=ViewApplicationProvider.getApplicationContext 已测试。onCheckStockTappedview val relayTestSubscription=tested.checkStoresRelay.test view.performClick relayTestSubscription.assertValueUnit } } 我使用过Robolectric,但它也应该与其他测试框架一起使用。如果您想亲自尝试,这些是我在测试项目中使用的依赖项:
@Test
fun `should check stores when checkStock is tapped`() {
// Arrange
val viewHolder = createViewHolder()
availableDeliveryOptionsModel.bind(viewHolder)
val actual = availableDeliveryOptionsModel.checkStoresRelay.test()
// Act
availableDeliveryOptionsModel.checkStoresRelay.accept(Unit)
viewHolder.itemView.textViewCheckStock.performClick()
// Assert
actual.assertValue(Unit)
}
您绝对不应该在测试中直接调用relay.accept。应在subscribeBy中代表您调用accept。该问题基于.debounce运算符 Debounce等待给定的时间,如果没有后续的“发射视图”单击,它会将项目向下游发射到.subscribeBy中。这会造成一些延迟并导致测试失败,因为在传递click emit之前调用了actual.assertValueUnit 您可以通过以下方法解决此问题。debounce操作符的执行是在当前线程上立即完成的,因此您基本上将处理项目交付到中继并在之后运行断言 我已将您的示例简化了一点,但我希望重点仍然是: 类别SO64328289{ val checkStoresRelay:Relay=PublishRelay.create 趣味onCheckStockTappedview:查看{ 点击查看 .debounce1,TimeUnit.ms .订阅人 onNext=checkStoresRelay::accept, onError={Log.eSO64328289,it.localizedMessage} } } @RunWithRobolectrictTestRunner::类 @Configsdk=[28] 类SO64328289测试{ @get:Rule val schedulerRule=RxSchedulerRule @试验 乐趣`当点击按钮时,继电器发出值`{ val测试=SO64328289 val view=ViewApplicationProvider.getApplicationContext 已测试。onCheckStockTappedview val relayTestSubscription=tested.checkStoresRelay.test view.performClick relayTestSubscription.assertValueUnit } } 我使用过Robolectric,但它也应该与其他测试框架一起使用。如果您想亲自尝试,这些是我在测试项目中使用的依赖项:
@Test
fun `should check stores when checkStock is tapped`() {
// Arrange
val viewHolder = createViewHolder()
availableDeliveryOptionsModel.bind(viewHolder)
val actual = availableDeliveryOptionsModel.checkStoresRelay.test()
// Act
availableDeliveryOptionsModel.checkStoresRelay.accept(Unit)
viewHolder.itemView.textViewCheckStock.performClick()
// Assert
actual.assertValue(Unit)
}
如何在android的库模块中侦听事件 唯一的方法是向模块添加您自己的侦听器、事件或发布&订阅框架。你无论如何都需要这样做 对于事件,请使用事件总线,如 如果您使用的是库,那么发布/订阅RxJava更适合未来
我相信这将帮助您有一个良好的开端。如何在android的库模块中收听事件 唯一的方法是向模块添加您自己的侦听器、事件或发布&订阅框架。你无论如何都需要这样做 对于事件,请使用事件总线,如 如果您使用的是库,那么发布/订阅RxJava更适合未来 我相信这将有助于你有一个良好的开端
implementation 'com.jakewharton.rxbinding3:rxbinding:3.1.0'
implementation 'com.jakewharton.rxrelay2:rxrelay:2.1.1'
implementation "io.reactivex.rxjava2:rxkotlin:2.4.0"
implementation "io.reactivex.rxjava2:rxjava:2.2.20"
testImplementation 'com.github.Plastix.RxSchedulerRule:rx2:1.0.2' // requires jitpack.io maven
testImplementation 'org.robolectric:robolectric:4.4'
testImplementation 'junit:junit:4.13.1'
testImplementation 'androidx.test:core:1.3.0'
// RX Java/Android
compile 'io.reactivex:rxjava:1.1.0'
// https://github.com/ReactiveX/RxAndroid
compile 'io.reactivex:rxandroid:1.1.0'
// https://github.com/JakeWharton/RxBinding/
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'