在将单元测试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相关推荐

  1. java hive查询_java程序调用hive查询的一个异常

    最近在java程序中调用hive做查询时,碰到一个异常,被困扰了许久,经过几番调试,逐步把问题定位清楚. 在异常描述前先给出异常信息:java.sql.SQLException: Error whil ...

  2. Java LinkedList特有方法程序小解 使用LinkedList 模拟一个堆栈或者队列数据结构。...

    package Collection;import java.util.LinkedList;/* LinkedList:特有的方法 addFirst()/addLast(); getFirst()/ ...

  3. java 单元测试用例_Java之单元测试工具(Junit)

    Junit是Java单元测试框架,一般Eclipse里面会集成这个Junit4测试工具 既然是测试工具,虽然开发用得比较多,但作为测试人员也需要具备会Junit测试的思想,况且技多不压身 这里简单介绍 ...

  4. java运行时_java编译时与运行时概念与实例详解

    Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念. 基础概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只 ...

  5. map java 初始化赋值_Java 中 HashMap 初始化时赋值(示例代码)

    1.HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器.普通青年一般会这么初始化: HashMap map = new HashMap ...

  6. java word 乱码_java另存word时出现乱码怎么办

    java另存word时出现乱码怎么办 发布时间:2020-04-07 11:05:31 来源:亿速云 阅读:92 作者:小新 这篇文章主要为大家详细介绍了java另存word时出现乱码怎么办,文中示例 ...

  7. java控制灯_Java使用桥接模式实现开关和电灯照明功能详解

    本文实例讲述了Java使用桥接模式实现开关和电灯照明功能.分享给大家供大家参考,具体如下: 一.模式定义 桥接模式,也称桥梁模式,在软件系统中,由于自身的逻辑,具有两个或多个维度的变化,如何应对这种多 ...

  8. java printwriter乱码_Java servlet 使用 PrintWriter 时的编码与乱码的示例代码

    在前面的网页中的编码与乱码系列中,曾多次提到使用 servlet 方式构建的动态响应流,不过在那里都是直接使用字节流的方式,不过,更为常见的方式是使用字符流.而在前面,又谈到了 Java 字节流与字符 ...

  9. java内存图片_Java程序缩放图片时,内存占用令我百思不得其解

    源代码如下,是一个很简单的程序.importjava.awt.FlowLayout;importjava.awt.Image;importjava.io.File;importjava.io.IOEx ...

最新文章

  1. 应用Mongoose开发MongoDB(2)模型(models)
  2. 数据结构之Trie树
  3. zz 标 题: 求weka JVM outofMemory问题的解决方案【已解决】
  4. 神马是线程?PHP对其具体的应用?应用在哪里?
  5. 云计算学习总结(1)——PaaS云平台部署之在Centos7搭建Mesos+Zookeeper+Marathon+Docker单机集群
  6. linux删除文件密码不奏效,Linux运维知识之linux_无秘登录问题(不生效)
  7. 诗词收集——用于人文素养扫盲
  8. Pr:音频和视频的同步
  9. 小高考三门计算机能报大专吗,江苏小高考没过能上大学吗
  10. RCLAMP0524P超低电容TVS二极管阵列,DFN-10L封装
  11. 信用社计算机专业大纲,信用社计算机专业试题
  12. 删除pdf文档中的批量水印
  13. python读取数据出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid contin
  14. 用Python做兼职是如何挣钱的?
  15. MassGrid分布式计算网络
  16. 4.3.5 计算电费
  17. 数字滤波算法 在数字信号处理应用中使用微控制器
  18. 海量存储检索原理系列文章
  19. tomcat启动正常,浏览器访问提示连接已重置
  20. ServiceNow - 自定义Task状态列表(Customize task State list)

热门文章

  1. Win10系统鼠标滑轮灵敏度怎么设置
  2. 技术员联盟win11旗舰版64位系统v2021.07
  3. Ubuntu中MySQL的启动/关闭/重启
  4. 信号回勾产生的原因_燃气减压阀振动的原因及处理方案
  5. java8中的map与flatmap区别
  6. 口袋之旅html5超强账号,口袋之旅特攻排行榜 强大的绝对能力
  7. redis发布订阅c接口_Redis 发布/订阅机制原理分析
  8. python web后端和vue哪个难_全栈开发用纯后端模板与Vue+后端框架组合哪个好?
  9. 计算机网络子网划分路由配置实验报告,完整的子网划分与路由交换实验报告 珍藏版哦...
  10. java 俄罗斯方块窗口_[代码全屏查看]-java 俄罗斯方块