当前位置: 首页 > 知识库问答 >
问题:

反应Spring单声道和doOnNext

洪昱
2023-03-14

我在我的项目中使用了spring-boot-starter-webflux、ractor-test和spring-boot-starter-test 2.0.0.m7。在我的RepositoryInMemory.Class中有一个List ,您可以通过savename(mono name) 方法添加字符串值。还可以询问通过getAllNames()方法添加到列表中的所有值。问题是如何测试RepositorYinMemory.Class?我有RepositorYinMemoryTest.Class,但它似乎不起作用,因为List 返回的总是0。我知道问题是RepositorYinMemory.Class中的DoonNext方法,但我不知道原因和如何解决它。有人知道我应该如何创建一个有效的Junit测试用例吗?

package com.example

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Repository
public class RepositoryInMemory {

    private final List<String> names = new ArrayList<>();

    public Flux<String> getAllNames() {
        return Flux.fromIterable(names);
    }

    public Mono<Void> saveName(Mono<String> name) {
        return name.doOnNext(report -> names.add(report)).then();
    }
}
package com.example

import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import reactor.core.publisher.Mono;

@RunWith(SpringRunner.class)
@SpringBootTest
public class RepositoryInMemoryTest {

    @Autowired
    private RepositoryInMemory repository;

    @Test
    public void addDataToList_ShouldReturnOne() {
        Mono<String> name = Mono.just("Example Name");
        repository.saveName(name);
        int count = Math.toIntExact(repository.getAllNames().count().block());
        assertEquals(1, count);
    }
}

共有1个答案

龚志
2023-03-14

为了便于将来的读者澄清,请使用subscribe()而不是block()。因为block()实际上会阻塞线程,直到接收到下一个信号,这是违反异步概念的。

如果确实要切换回同步流,请使用block()

 类似资料:
  • 我有一个服务电话返回单声道。现在,在给用户提供API响应的同时,我想发送一些响应。我试过用flatMap和地图,但它不起作用。它给了我一个空的身体作为回应。 谢谢你

  • 我有一个 其中func()返回Mono。将此对象列表转换为并从流返回的最简单方法是什么?

  • 我对Spring Reactive还是个新手。 我想将一个Spring反应式回购通量响应转换为另一种类型的单声道响应: 我已经尝试了提供的运算符(转换是我需要的闭包,但它仍然将repo结果的每一个参数都提供为reactive参数),但最终不能得到任何我知道如何使用的东西。

  • 给定以下monos: 双: 和: 具有相同的输出: 和之间有什么区别,在这种情况下? 从https://projectreactor.io/docs/core/release/reference/index.html#which-operator: [如果你]有一个序列,但[你]对值不感兴趣,并且[你]想在最后切换到另一个单声道,[使用]。 [如果您]希望通过将发布者从1个Mono和任何源端协调到

  • 我不知道或问这个问题,除了这里,如果不是我道歉的地方。 这里有一个REST请求,它附带了一个简单的bean,其中包含一个列表等属性。对此列表进行迭代,以使用返回Mono(findOne)的响应mongo调用。但我不认为我找到了正确的方法: 在我看来,“反应性”的想法并不是必须做一个块,但我没有找到如何做,否则。 有人能帮我找到做这项任务的最佳方法吗?