java - 测试dataBinder spring验证
问题描述
我有验证者的课程。
@Component("beforeCreateLanguageDtoValidator")
public class LanguageDtoValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return LanguageDto.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
//some logic validator
}
}
以及使用此验证器的服务层中的方法。
public boolean isValid(LanguageDto dto) {
DataBinder dataBinder = new DataBinder(dto);
dataBinder.addValidators(languageDtoValidator);
dataBinder.validate(dto);
if (dataBinder.getBindingResult().hasErrors()) {
String errorsMessage = dataBinder.getBindingResult().getAllErrors().stream().
map(e -> messageSource.getMessage(e, Locale.getDefault()))
.collect(Collectors.joining("\n"));
throw new LanguageNameNotValidException(errorsMessage);
}
return true;
}
我不明白,我们是如何测试这种方法的。我已经写了两个测试,但它们都不起作用。
@Test
void shouldGetTrueWhenDtoIsValid() {
//when
doNothing().when(dataBinder).addValidators(languageDtoValidator);
doNothing().when(dataBinder).validate(dto);
when(dataBinder.getBindingResult().hasErrors()).thenReturn(false);
boolean result = languageService.isValid(dto);
//than
assertThat(result).isEqualTo(true);
verify(dataBinder, times(1)).getBindingResult().hasErrors();
verify(dataBinder, times(1)).addValidators(languageDtoValidator);
verify(dataBinder, times(1)).validate(dto);
}
@Test
void shouldGetThrowExceptionWhenDtoIsNotValid() {
//when
doNothing().when(dataBinder).addValidators(languageDtoValidator);
doNothing().when(dataBinder).validate(dto);
when(dataBinder.getBindingResult().hasErrors()).thenReturn(true);
//than
verify(dataBinder, times(1)).getBindingResult().hasErrors();
verify(dataBinder, times(1)).addValidators(languageDtoValidator);
verify(dataBinder, times(1)).validate(dto);
assertThatThrownBy(() -> languageService.isValid(dto))
.isInstanceOf(LanguageNameNotValidException.class);
}
当我在这里捕获 NPE 时:
`when(dataBinder.getBindingResult().hasErrors()).thenReturn(false);
at com.springCrudV2.demo.service.LanguageServiceTest.shouldGetThrowExceptionWhenDtoIsNotValid`
你能建议我解决这个问题吗?
解决方案
推荐阅读
- react-native - 如何在本机反应中删除操作栏
- android - 在flutter中在pushNamedandRemoveUntil中传递参数
- nginx - nginx 重写不会将 $arg_page 转发到上游
- python-3.x - 如何在Opencv Python中将多个图像保存到目标文件夹
- c# - 使用 MediatR 编辑动作 CQRS 模式
- javascript - 在 Axios、request 和 XMLHttpRequest 库上没有收到来自 URL 的响应,但在 Python-requests 和 https://reqbin.com/ 中工作正常
- shell - 如何从文件中传递变量名并在 unix 的脚本中使用该变量
- javascript - 如果有的话,在 Promise 上链接太多的 .then 对性能有什么影响?
- java - java中从字符串类型转换为int时的数字格式异常
- swift - SwiftUI macOS - 创建可点击的超链接