Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Webflux如何验证所有步骤都已成功执行_Java_Spring Boot_Spring Webflux_Java 9 - Fatal编程技术网

Java Spring Webflux如何验证所有步骤都已成功执行

Java Spring Webflux如何验证所有步骤都已成功执行,java,spring-boot,spring-webflux,java-9,Java,Spring Boot,Spring Webflux,Java 9,我是春季webflux的新手,我刚刚开始webflux项目,我被困在一个地方 我正在创建一个具有Id和文件名的学生对象 在studentService上调用deleteById(Long)方法时,首先要从存储中删除文件,然后要从存储库中删除记录 所有这些方法都返回Mono 下面是我为学生提供的服务和存储库代码 public class Student { private Long id; private String fileName; //getter & setter

我是春季webflux的新手,我刚刚开始webflux项目,我被困在一个地方

我正在创建一个具有Id文件名的学生对象

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

    }
}
公共班级学生{
私人长id;
私有字符串文件名;
//吸气剂和塞特
}
公共班级学生公寓{
公共单声道findById(长l){
学生样本=新学生();
setFileName(“文件名”);
样本集ID(1L);
返回Mono.just(示例);
}
公共文件(字符串文件名){
返回Mono.empty();
}
公共单删除字节id(长id){
返回Mono.empty();
}
}
公共班级学生服务{
私人科研储备库;
公共存储库(StudentRepository存储库){
this.repository=存储库;
}
公共单声道findById(长l){
学生样本=新学生();
setFileName(“文件名”);
样本集ID(1L);
返回Mono.just(示例);
}
公共单删除字节id(长id){
返回repository.findById(id)
.flatMap(学生->
repository.deleteFile(student.getFileName())。然后返回(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();
  }
公共无效测试(){
StudentService StudentService=新的StudentService();
StudentRepository StudentRepository=mock(StudentRepository.class);
studentService.setRepository(studentRepository);
学生=新生();
setFileName(“文件名”);
学生setId(1L);
Mono studentMono=Mono.just(学生);
Mockito.when(studentRepository.findById(1L)),然后返回(studentMono);
studentService.deleteById(1L);
StepVerifier.create(studentMono)
.expectNextMatches(leadImport->leadImport.getFileName().equals(“文件名”))
.expectNextMatches(leadImport->leadImport.getId()==1L)
.verifyComplete();
}
但是我的测试失败了

有人能帮我验证一下我所有的预期步骤吗

  • 第一次删除文件
  • 从数据库第二次删除

你从一个Mono创建了一个StepVerifier。只是(学生),它意味着你正在观看一个元素

如果您有多个元素:Flux.just(student1、student2,…),那么链接ExpectNextMatch将起作用,因为它将验证每个学生的每次调用

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

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

首先想到的是repository.deleteFile(student.getFileName());返回Mono.just(学生);您正在功能世界中编写命令。您需要链接返回的Mono.empty,因为在您订阅之前不会发生任何事情。将其重写为:return repository.deleteFile(student.getFileName())。然后返回(student)@ThomasAndo如果我按照您的建议更改了deleteById方法,但仍然要如何验证调用?使用此代码,如何验证调用存储库。deleteById(studentMono.getId())是否正在执行?如果您希望验证对mock的调用,有几种方法