我在项目中使用spring-boot-starter-webflux,reactor-test和spring-boot-starter-test 2.0.0.M7。在我的RepositoryInMemory.class中有一个List<String>,您可以在其中通过saveName(Mono<String> name)方法添加字符串值。您还可以询问通过getAllNames()方法添加到列表中的所有值。问题是如何测试RepositoryInMemory.class?我有RepositoryInMemoryTest.class,但由于List<String>总是返回0,所以它似乎不起作用。我知道问题是doOnNext中的RepositoryInMemory.class方法,但是我不知道为什么以及如何解决它。有谁知道我应该如何创建有效的Junit测试用例?

RepositoryInMemory类

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();
    }
}


RepositoryInMemoryTest类

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);
    }
}

最佳答案

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

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

10-07 22:43