Android 单元测试,以检查在使用RxBindings时是否调用了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中。这会造成一些延迟并导致

我编写了一个单元测试,用于测试是否调用了使用jakeWartons rxBindings的PublishRelay accept

这是我正在测试的代码片段

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'