java - Spring Webflux如何验证所有步骤是否执行成功

标签 java spring-boot spring-webflux java-9

我是 Spring webflux 的新手,我刚刚启动 webflux 项目,但我卡在一个地方。

我正在使用 IdFileName 创建一个学生对象。

当我在studentService上调用deleteById(Long)方法时,我想首先从存储中删除文件,然后我想从存储库中删除记录,

所有这些方法都返回 Mono

以下是我为学生提供的服务和存储库代码

public class Student {
  private Long id;
  private String fileName;

  //getter & setter

}


public class StudentRepository {

    public Mono<Student> findById(long l){
        Student sample = new Student();
        sample.setFileName("file-name");
        sample.setId(1L);
        return Mono.just(sample);
    }

    public Mono<Void> deleteFile(String fileName) {
        return Mono.empty();
    }
    public Mono<Void> deleteById(Long id) {
        return Mono.empty();
    }
}


public class StudentService {

    private StudentRepository repository;

    public void setRepository(StudentRepository repository) {
        this.repository = repository;
    }

    public Mono<Student> findById(long l){
        Student sample = new Student();
        sample.setFileName("file-name");
        sample.setId(1L);
        return Mono.just(sample);
    }
    public Mono<Void> deleteById(Long id){
        return repository.findById(id)
                .flatMap(student ->
                        repository.deleteFile(student.getFileName()).thenReturn(student)
                )
                .flatMap(studentMono ->
                        repository.deleteById(studentMono.getId())
                );

    }
}

现在我想验证第一个文件是否已从文件存储中删除,然后记录应从数据库中删除。

我编写了如下测试

public void test(){

    StudentService studentService = new StudentService();
    StudentRepository studentRepository = mock(StudentRepository.class);
    studentService.setRepository(studentRepository);
    Student student = new Student();
    student.setFileName("file-name");
    student.setId(1L);
    Mono<Student> studentMono = Mono.just(student);
    Mockito.when(studentRepository.findById(1L)).thenReturn(studentMono);

    studentService.deleteById(1L);

    StepVerifier.create(studentMono)
            .expectNextMatches(leadImport->leadImport.getFileName().equals("file-name"))
            .expectNextMatches(leadImport -> leadImport.getId() == 1L)
            .verifyComplete();
  }

但是我的测试失败了。

有人可以帮助我如何验证我所有预期的步骤,例如

  • 首先删除文件
  • 第二次从数据库中删除

最佳答案

您从 Mono.just(student) 创建了一个 StepVerifier,这意味着您正在观看单个元素

如果您有多个元素,则链式expectNextMatches将起作用:Flux.just(student1,student2,..),因为它将验证每个调用的每个学生

通过仅调用一次expectNext来更改您的代码:

StepVerifier.create(studentMono)
            .expectNextMatches(leadImport->leadImport.getFileName().equals("file-name") && leadImport.getId() == 1L)
            .verifyComplete();

关于java - Spring Webflux如何验证所有步骤是否执行成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59481031/

相关文章:

java - 弃用分页参数

java - 使用 IP 进行本地和远程调用时,Spring Web-Flux Server Sent Events 不起作用

java - Maven javadoc 插件仅修复现有的 javadoc

java - 我可以通过在子类中包含父类来以递归方式反序列化 json 吗?

java - Tomcat6 MySql JDBC 数据源配置

spring - 如何使用 Spring Data Elasticsearch ElasticsearchRepository 突出显示

java - 如何使用注解代替 HttpSecurity?

java - 如何跟踪我的内部框架?

spring-boot - 使用 Spring Webflux 时在后台运行 Mono,同时返回响应

java - 如何从http请求创建Flux