spring Sping Boot Reactive:向控制器中添加@ annotation会导致相关测试失败

kxxlusnw  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(35)

我目前在一个Sprig Boot (2)React式项目中工作。所有的CRUD端点和测试都工作得很好。然后我决定在创建todo时添加验证,为此我在我的仓库类中添加了注解:

@Data
@Container(containerName = "myContainer")
public class ToDo {
    @Id
    @PartitionKey
    @GeneratedValue
    private String id;
    @NotBlank(message = "Category must not be blank")
    private String category;
    @NotNull(message = "Complete must not be null")
    @AssertTrue(message = "Complete must be either true or false")
    private boolean complete;
    @NotBlank(message = "Name must not be blank")
    private String name;

}

字符串
我在控制器方法中添加了一个@Valid注解,用于创建todo

@PostMapping
    public Mono<ResponseEntity<ToDo>> createTodo(@Valid @RequestBody ToDo toDoItem) {
        return toDoService.saveItem(toDoItem)
                .flatMap(savedItem -> Mono.just(ResponseEntity.status(HttpStatus.CREATED).body(savedItem)))
                .onErrorResume(DuplicateItemException.class, ex ->
                        Mono.just(ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ToDoDAO())));
    }


这是相应的测试:

@Test
void createItem() {
        ToDoDAO newItem = new ToDoDAO();
        newItem.setName("New Item");
        newItem.setCategory("Category");
        newItem.setComplete(false);

        createItem(newItem).expectStatus().isCreated();
    }


问题是:通过添加@Valid注解,这个特定的测试无法通过,返回一个错误的请求响应。如果我删除@Valid注解,测试再次通过。任何建议都是非常感谢的。
我希望返回的状态码是201,已创建。

4si2a6ki

4si2a6ki1#

这个问题与@Valid annotation有关。我解决这个问题的方法是删除annotation并创建一个helper类,并在service implementation类中使用它。这种方法对性能更好,因为在访问数据库之前会验证项目:

@Override
public Mono<ToDoDAO> saveItem(ToDoDAO toDoItem) {
    todoValidator.validate(toDoItem);

    return todoRepository.getItem(toDoItem.getId())
            .flatMap(existingItem -> Mono.<ToDoDAO>error(new DuplicateItemException("Id " + toDoItem.getId() + " already exists in the database")))
            .switchIfEmpty(todoRepository.save(toDoItem));
}

字符串

相关问题