java控制单元测试_java – 当单元测试控制器时,模拟一个Spring Validator
在将单元测试postmortem编码到另一个项目创建的代码时,我遇到了如何使用initBinder模拟与控制器绑定的验证器的这个问题?
通常我会考虑确保我的输入是有效的,并且在验证器中进行一些额外的调用,但在这种情况下,验证器类与通过几个数据源进行检查相结合,并且测试变得相当麻烦.耦合可追溯到使用的一些旧的常用库,并且不在我目前的工作范围内来修复它们.
起初,我试图使用PowerMock和嘲笑静态方法来嘲笑验证器的外部依赖关系,但是最终遇到一个类,当类被创建时需要一个数据源,没有找到一个方法.
然后,我试图使用普通的mockito工具来嘲笑验证器,但是也没有.然后尝试将验证器设置在mockMvc调用中,但不会为验证器注册@Mock注释.最后跑到this question.但是由于控制器本身没有现场验证器,所以也失败了.那么,我该如何解决这个问题呢?
验证器:
public class TerminationValidator implements Validator {
// JSR-303 Bean Validator utility which converts ConstraintViolations to Spring's BindingResult
private CustomValidatorBean validator = new CustomValidatorBean();
private Class extends Default> level;
public TerminationValidator(Class extends Default> level) {
this.level = level;
validator.afterPropertiesSet();
}
public boolean supports(Class> clazz) {
return Termination.class.equals(clazz);
}
@Override
public void validate(Object model,Errors errors) {
BindingResult result = (BindingResult) errors;
// Check domain object against JSR-303 validation constraints
validator.validate(result.getTarget(),result,this.level);
[...]
}
[...]
}
控制器:
public class TerminationController extends AbstractController {
@InitBinder("termination")
public void initBinder(WebDataBinder binder,HttpServletRequest request) {
binder.setValidator(new TerminationValidator(Default.class));
binder.setAllowedFields(new String[] { "termId[**]","terminationDate","accountSelection","iban","bic" });
}
[...]
}
测试类:
@RunWith(MockitoJUnitRunner.class)
public class StandaloneTerminationTests extends BaseControllerTest {
@Mock
private TerminationValidator terminationValidator = new TerminationValidator(Default.class);
@InjectMocks
private TerminationController controller;
private MockMvc mockMvc;
@Override
@Before
public void setUp() throws Exception {
initMocks(this);
mockMvc = standaloneSetup(controller)
.setCustomArgumentResolvers(new TestHandlerMethodArgumentResolver())
.setValidator(terminationValidator)
.build();
ReflectionTestUtils.setField(controller,"validator",terminationValidator);
when(terminationValidator.supports(any(Class.class))).thenReturn(true);
doNothing().when(terminationValidator).validate(any(),any(Errors.class));
}
[...]
}
例外:
java.lang.IllegalArgumentException: Could not find field [validator] of type [null] on target [my.application.web.controller.TerminationController@560508be]
at org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:111)
at org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:84)
at my.application.web.controller.termination.StandaloneTerminationTests.setUp(StandaloneTerminationTests.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
java控制单元测试_java – 当单元测试控制器时,模拟一个Spring Validator相关推荐
- java hive查询_java程序调用hive查询的一个异常
最近在java程序中调用hive做查询时,碰到一个异常,被困扰了许久,经过几番调试,逐步把问题定位清楚. 在异常描述前先给出异常信息:java.sql.SQLException: Error whil ...
- Java LinkedList特有方法程序小解 使用LinkedList 模拟一个堆栈或者队列数据结构。...
package Collection;import java.util.LinkedList;/* LinkedList:特有的方法 addFirst()/addLast(); getFirst()/ ...
- java 单元测试用例_Java之单元测试工具(Junit)
Junit是Java单元测试框架,一般Eclipse里面会集成这个Junit4测试工具 既然是测试工具,虽然开发用得比较多,但作为测试人员也需要具备会Junit测试的思想,况且技多不压身 这里简单介绍 ...
- java运行时_java编译时与运行时概念与实例详解
Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念. 基础概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只 ...
- map java 初始化赋值_Java 中 HashMap 初始化时赋值(示例代码)
1.HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器.普通青年一般会这么初始化: HashMap map = new HashMap ...
- java word 乱码_java另存word时出现乱码怎么办
java另存word时出现乱码怎么办 发布时间:2020-04-07 11:05:31 来源:亿速云 阅读:92 作者:小新 这篇文章主要为大家详细介绍了java另存word时出现乱码怎么办,文中示例 ...
- java控制灯_Java使用桥接模式实现开关和电灯照明功能详解
本文实例讲述了Java使用桥接模式实现开关和电灯照明功能.分享给大家供大家参考,具体如下: 一.模式定义 桥接模式,也称桥梁模式,在软件系统中,由于自身的逻辑,具有两个或多个维度的变化,如何应对这种多 ...
- java printwriter乱码_Java servlet 使用 PrintWriter 时的编码与乱码的示例代码
在前面的网页中的编码与乱码系列中,曾多次提到使用 servlet 方式构建的动态响应流,不过在那里都是直接使用字节流的方式,不过,更为常见的方式是使用字符流.而在前面,又谈到了 Java 字节流与字符 ...
- java内存图片_Java程序缩放图片时,内存占用令我百思不得其解
源代码如下,是一个很简单的程序.importjava.awt.FlowLayout;importjava.awt.Image;importjava.io.File;importjava.io.IOEx ...
最新文章
- 应用Mongoose开发MongoDB(2)模型(models)
- 数据结构之Trie树
- zz 标 题: 求weka JVM outofMemory问题的解决方案【已解决】
- 神马是线程?PHP对其具体的应用?应用在哪里?
- 云计算学习总结(1)——PaaS云平台部署之在Centos7搭建Mesos+Zookeeper+Marathon+Docker单机集群
- linux删除文件密码不奏效,Linux运维知识之linux_无秘登录问题(不生效)
- 诗词收集——用于人文素养扫盲
- Pr:音频和视频的同步
- 小高考三门计算机能报大专吗,江苏小高考没过能上大学吗
- RCLAMP0524P超低电容TVS二极管阵列,DFN-10L封装
- 信用社计算机专业大纲,信用社计算机专业试题
- 删除pdf文档中的批量水印
- python读取数据出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid contin
- 用Python做兼职是如何挣钱的?
- MassGrid分布式计算网络
- 4.3.5 计算电费
- 数字滤波算法 在数字信号处理应用中使用微控制器
- 海量存储检索原理系列文章
- tomcat启动正常,浏览器访问提示连接已重置
- ServiceNow - 自定义Task状态列表(Customize task State list)
热门文章
- Win10系统鼠标滑轮灵敏度怎么设置
- 技术员联盟win11旗舰版64位系统v2021.07
- Ubuntu中MySQL的启动/关闭/重启
- 信号回勾产生的原因_燃气减压阀振动的原因及处理方案
- java8中的map与flatmap区别
- 口袋之旅html5超强账号,口袋之旅特攻排行榜 强大的绝对能力
- redis发布订阅c接口_Redis 发布/订阅机制原理分析
- python web后端和vue哪个难_全栈开发用纯后端模板与Vue+后端框架组合哪个好?
- 计算机网络子网划分路由配置实验报告,完整的子网划分与路由交换实验报告 珍藏版哦...
- java 俄罗斯方块窗口_[代码全屏查看]-java 俄罗斯方块