- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
> observab-6ren">
我正在尝试向以下代码添加一些单元测试:
public List<Stuff> extractStuff(Scheduler scheduler, List<Token> tokens) {
List<Observable<List<Stuff>>> observables = tokens
.stream()
.map(token-> Observable.just(getStuffByToken(token)).subscribeOn(scheduler))
.collect(Collectors.toList());
List<Stuff> result = new ArrayList<>();
for (List<Stuff> stuff: Observable.merge(observables).toBlocking().toIterable()) {
result.addAll(stuff);
}
return result;
}
我希望以并行方式获取 Stuff
对象,但我需要在继续之前收集所有这些对象(否则下一个过程没有任何意义)。
代码按预期工作,但我在单元测试方面遇到困难:
@Test
public void extractStuff() {
// GIVEN
TestScheduler scheduler = new TestScheduler();
List<Token> tokens = buildTokens();
...
// WHEN
List<Stuff> result = this.instance.extractStuff(scheduler, tokens);
// Execution never comes to this point...
// THEN
...
}
使用调试器,我可以看到 Observable.just(...)
看起来不错(我的可观察对象列表不为空,并且我可以在里面看到我的自定义模拟对象)。
问题: 执行似乎停留在 Observable.merge(observables).toBlocking()
表达式处。 result.addAll
行从未被调用。
我已经用 TestScheduler
对象尝试了几种方法,但我无法让它工作。我在 Internet 上找到的大多数示例都处理返回 Observable
对象的函数,因此关联的单元测试可以运行 scheduler.advanceTimeBy(...);
。在我的情况下,我无法应用这种方法,因为 Observable
对象不会直接返回。
非常感谢您的帮助!
最佳答案
我不确定发布的代码是否按照您期望的方式运行。您的 getStuffByToken(...)
方法实际上是在调用线程上调用的,而不是由 Scheduler
调用的。
为简单起见,我将 Token
替换为 Integer
,将 Stuff
替换为 String
。
我的 getStuffByToken(...)
将返回 Integer
的 String
表示,还将包括当前的 Thread
的名字:
private List<String> getStuffByToken( Integer token )
{
return Arrays.asList( token.toString(), Thread.currentThread().getName() );
}
我可能在使用不同版本的 RxJava,我没有 toBlocking(...)
方法但是有 blockingIterable()
- 我希望这是等效:
public List<String> extractStuff(Scheduler scheduler, List<Integer> tokens) {
List<Observable<List<String>>> observables = tokens
.stream()
.map(token-> Observable.just(getStuffByToken(token)).subscribeOn(scheduler))
.collect(Collectors.toList());
List<String> result = new ArrayList<>();
for (List<String> stuff: Observable.merge(observables).blockingIterable()) {
result.addAll(stuff);
}
return result;
}
如果我们测试上面的内容:
@Test
public void testExtractStuff()
{
List<Integer> tokens = Arrays.asList( 1, 2, 3, 4, 5 );
List<String> result = extractStuff( Schedulers.computation(), tokens );
System.out.println( result );
}
我们回来了:
[1, main, 3, main, 4, main, 5, main, 2, main]
如您所知,所有 getStuffByToken(...)
调用都是在 main Thread
上执行的。
接下来,您的测试方法未被调用的原因是因为 TestScheduler
需要调用 TestScheduler.advanceTimeBy(...)
来模拟导致处理 Rx 管道的时间。由于您的方法是阻塞方法,因此使用 TestScheduler
进行测试并不方便。
根据以上两条信息,我建议您按照以下思路做一些事情:
public Single<List<String>> extractStuff( Scheduler scheduler, List<Integer> tokens )
{
return Observable.fromIterable( tokens )
.flatMap( token -> Observable.just( token )
.subscribeOn( scheduler )
.map( this::getStuffByToken )
.flatMap( Observable::fromIterable ))
.toList();
}
您的生产代码可以调用 extractStuff(...).blockingGet()
来解析 List
。
并且,您可以按如下方式进行测试:
@Test
public void testExtractStuff()
{
TestScheduler scheduler = new TestScheduler();
List<Integer> tokens = Arrays.asList( 1, 2, 3, 4, 5 );
TestObserver<List<String>> test = extractStuff( scheduler, tokens ).test();
scheduler.advanceTimeBy( 1, TimeUnit.SECONDS );
test.assertValueCount( 1 );
test.assertValue( list -> list.size() == 10 );
test.assertComplete();
}
关于java - RxJava - 如何使用内部 "toBlocking"调用测试函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60953775/
我正在使用 RxJava 将应用程序重构为响应式范例。我正在逐步进行,所以我需要使用 toBlocking()在某些情况下,暂时为了尊重接口(interface)。使用时如何处理错误 toBlocki
我正在尝试向以下代码添加一些单元测试: public List extractStuff(Scheduler scheduler, List tokens) { List>> observab
我发现下面的代码(为简洁起见进行了修改),它有错误,并且据我所知存在缺陷。 它使用 toBlocking() ,一般不建议使用,并且已在响应式(Reactive)上下文中使用 它返回 single()
我正在尝试编写测试用例并尝试访问返回单个对象的方法。为此,我想使用 toBlocking 但我无法访问它并收到以下错误: Value of type 'Single' (aka 'PrimitiveS
我有时使用 RxJava 以更实用的风格编写一些复杂的过滤、映射等(我知道这不是它的用途,我很乐意为此使用 Kotlin 或 Java 8,但是我不能(我使用的是 Android,所以只能使用 6)。
使用Observable在springboot应用程序中集成RxJava,我们能够从服务获取数据。但我对使用 toBlocking() 方法有疑问,因为我读过很多论坛帖子,说它在生产服务器中存在问题。
我目前在 Android 上使用 RxJava 和 Kotlin,但我有一个问题,如果不使用 toBlocking() 就无法解决。 我在员工服务中有一个返回 Observable 的方法>: fun
这里是Couchbase新手,使用Couchbase Server v4.0.0和Java SDK v2.2.3。我有以下用于运行查询的代码 Observable .defer
我是一名优秀的程序员,十分优秀!