我是 Spring webflux 的新手,我刚刚启动 webflux 项目,但我卡在一个地方。
我正在使用 Id 和 FileName 创建一个学生对象。
当我在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/