Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用DomainClassConverter干净地测试检索参数的Spring控制器?_Java_Spring_Unit Testing_Spring Mvc_Mockito - Fatal编程技术网

Java 如何使用DomainClassConverter干净地测试检索参数的Spring控制器?

Java 如何使用DomainClassConverter干净地测试检索参数的Spring控制器?,java,spring,unit-testing,spring-mvc,mockito,Java,Spring,Unit Testing,Spring Mvc,Mockito,我热衷于干净、隔离良好的单元测试。但在这里,我在测试一个使用DomainClassConverter特性获取实体作为其映射方法参数的控制器时遇到了一个简单的问题 @实体 类实体{ @身份证 私有整数id; //其余的财产都在这里。 } 控制器的定义如下 @RequestMapping/api/v1/myentities 类MyEntitiesController{ @自动连线 私人DoSomethingService作为服务; @PostMapping/{id} 公共责任update@PathV

我热衷于干净、隔离良好的单元测试。但在这里,我在测试一个使用DomainClassConverter特性获取实体作为其映射方法参数的控制器时遇到了一个简单的问题

@实体 类实体{ @身份证 私有整数id; //其余的财产都在这里。 } 控制器的定义如下

@RequestMapping/api/v1/myentities 类MyEntitiesController{ @自动连线 私人DoSomethingService作为服务; @PostMapping/{id} 公共责任update@PathVariableidOptionalmyEntity{ //做这里需要做的事 } } 因此,从DomainClassConverter small我知道它使用CrudePositoryFindByid来查找实体。我想知道的是,我怎样才能在测试中清晰地模仿它。 我通过以下步骤取得了一些成功:

创建一个我可以模拟的自定义转换器/格式化程序 用上面的转换器实例化我自己的MockMvc 在每次测试时重置模拟并更改行为。 问题是设置代码很复杂,因此很难调试和解释。我的团队99%都是来自rails或uni的年轻人,所以我们必须保持简单。我想知道是否有一种方法可以在继续使用@Autowired MockMvc进行测试的同时,从单元测试中注入所需的MyEntity实例

目前,我正试图看看我是否能为MyEntity注射一种类似Crudepository的药物,但并没有成功。我已经有几年没有使用Spring/Java了,所以我对可用工具的了解可能不是最新的

因此,从DomainClassConverter的小文档中,我知道它使用CrudePositoryFindByid来查找实体。我想知道的是,我怎样才能在测试中清晰地模仿它

为了返回所需的实体,需要模拟在CRUDEPositoryFindById之前调用的2个方法。下面的示例使用RestAssuredMockMvc,但如果您也注入WebApplicationContext,则可以对MockMvc执行相同的操作

@RunWithSpringRunner.class @SpringBootTestclasses=SomeApplication.class 公共类SomeControllerTest{ @自动连线 私有WebApplicationContext上下文; @MockBeanname=MVC转换服务 私有WebConversionService WebConversionService; @以前 公共空间设置{ restassuredmocmvc.webAppContextSetupcontext; SomeEntity SomeEntity=新的SomeEntity; 当WebConversionService.canConvertanyTypeDescriptor.class、anyTypeDescriptor.class .然后返回真值; 当WebConversionService.converteq1、anyTypeDescriptor.class、anyTypeDescriptor.class .然后返回实体; } } 在某个时刻,Spring Boot将执行WebConversionService::convert,它稍后将调用DomainClassConverter::convert,然后调用类似invoker.invokeFindById的东西,它将使用实体存储库来查找实体

那么,为什么要模拟WebConversionService而不是DomainClassConverter呢?因为DomainClassConverter是在应用程序启动期间实例化的,没有注入:

域类转换器= 新域名ClassConverterConversionService; 同时,WebConversionService是一个允许我们模拟它的bean:

@豆子 @凌驾 公共格式转换服务MVC转换服务{ WebConversionService conversionService=new WebConversionService this.mvcProperties.getDateFormat; addFormattersconversionService; 返回转换服务; } 将模拟bean命名为mvcConversionService很重要,否则它将不会替换原始bean

关于存根,您需要模拟2个方法。首先,您必须说明您的模拟可以转换任何内容:

当WebConversionService.canConvertanyTypeDescriptor.class、anyTypeDescriptor.class .然后返回真值; 然后是main方法,它将匹配URL路径中定义的所需实体ID:

当WebConversionService.converteq1、anyTypeDescriptor.class、anyTypeDescriptor.class .然后返回实体; 到目前为止还不错。但是匹配目的地类型不是更好吗?类似于eqTypeDescriptor.valueOfSomeEntity.class的东西?它会,但这会创建TypeDescriptor的新实例,在域转换期间调用此存根时,该实例将不匹配


这是我使用过的最干净的解决方案,但我知道如果Spring允许的话,效果会更好。

你也可以分享一下你的测试类吗?@Morfic抱歉,我真的不想修改我的测试类。我想知道是否有一种通过MockMVC测试此类控制器方法的好方法。我也不想修改您的测试,我的目的是基于您的实际代码构建一个示例,这样您就可以熟悉它,而我的工作量就更少了。尽管如此,你还是可以看一看,或者甚至在某些选项上,你的这个似乎是它的复制品,然后决定你的实现 由于未处理其他方法调用,ConversionService导致了问题。因此,我使用@SpyBean只覆盖选定的方法调用。我的博客中提供了一个示例: