当前位置: 首页 > 知识库问答 >
问题:

Spring MVC测试

樊宏邈
2023-03-14

我正在与

  • Spring框架4.3.3
  • AspectJ 1.8.9

我有两个@控制器,一个用于mvc而另一个用于rest。每种方法都使用了一个@服务的依赖关系。

我有以下Rest方法

package com.manuel.jordan.controller.persona;

@Controller
@RequestMapping(value="/personas")
public class PersonaRestController {

    @PutMapping(value="/{id}", consumes={MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE})
    public ResponseEntity<Void> updateOne(@PathVariable String id, @Validated @RequestBody Persona persona){
       persona = personaService.updateOne(persona);
       return ResponseEntity.noContent().build();
    }

观察我使用的第二个参数@Validated

我有以下切入点:

@Pointcut(value=
"execution(* com.manuel.jordan.controller.persona.PersonaRestController.updateOne(..))")
public void updateOnePointcut(){}

以及以下建议:

@Around(value="PersonaRestControllerPointcut.updateOnePointcut()")
@Transactional(noRollbackFor={Some exceptions})
public Object aroundAdviceUpdateOne(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

   logger.info("Beginning aroundAdviceUpdateOne - Class: {}, Method: {}",   
   proceedingJoinPoint.getTarget().getClass().getSimpleName(),
   proceedingJoinPoint.getSignature().getName());

   ....

}

通过Spring MVC测试

当我发送有效数据时:

如:

resultActions = mockMvc.perform(put(uri).contentType(MediaType.APPLICATION_JSON_UTF8)
                        .accept(MediaType.APPLICATION_JSON_UTF8)
                        .header("Accept-Language", locale.toString())
.content(JsonTransformerSupport.objectToJson(personaValid))).andDo(print());

或者由

RequestEntity<Persona> requestEntity = RequestEntity.put(uri).contentType(MediaType.APPLICATION_JSON_UTF8)                                                                             
 .accept(MediaType.APPLICATION_JSON_UTF8)
 .header("Accept-Language", locale.toString())                                                                          
 .body(personaValid);

通过< code>Gradle报告,我可以确认< code>@Around建议的效果如何。它只是看着AdviceUpdateOne - Class周围的< code >开始....报告中的文本和建议正文的其余部分按预期方式工作。

问题是当我发送无效数据以通过@Validated

使用上面显示的两种方式,但只是改变角色角色验证(空字段,打破最小值和最大值边界等),我确实意识到@Around建议总是被忽略。它证实了开始周围通知更新一 - 类....从未出现。

注意:即使@Around建议不起作用,也会发生验证过程。我的意思是,没有例外。@Test方法通过。

以下是一些注意事项。

    < li >我对< code>@Before建议有相同的行为。 < li >我假设在执行< code > personarestcontroller . update one 方法之前,< code>@Around(甚至< code>@Before)建议必须发挥作用。不管数据是否有效。 < li >当我向非rest控制器发送有效或无效数据时,这种情况完全有效

该方法是:

@PutMapping(value="/update/{id}",
            consumes=MediaType.APPLICATION_FORM_URLENCODED_VALUE,
            produces=MediaType.TEXT_HTML_VALUE)
public String updateOne(@PathVariable String id,
             @Validated @ModelAttribute Persona persona,
             BindingResult result,
             RedirectAttributes redirectAttributes){

同样的@Around建议有效,只是有以下变化(注意||):

@Around(value="PersonaRestControllerPointcut.updateOnePointcut() || PersonaControllerPointcut.updateOnePointcut()")
@Transactional(noRollbackFor={some exceptions })
public Object aroundAdviceUpdateOne(JoinPoint proceedingJoinPoint) throws Throwable {

更新 01

因此,@Around建议应适用于4种情况:

  • 具有有效数据的非静态方法(works)
  • 具有无效数据的非rest方法(works)
  • 具有有效数据的rest方法(works)
  • 包含无效数据的rest方法(失败或被忽略-<代码>@Around</code>不执行

同样:< code>@Validated的工作方式与rest和非rest方法相同。问题是关于< code>@Around建议,当< code>Rest方法在发送无效数据时执行时,它不起作用。怎么了?还是失踪?

更新 02

< code>@Validated是:

JSR-303 Valid的变体,支持验证组的规范。旨在方便地与Spring的JSR-303支持一起使用,但不是JSR-303特定的

它从其API中删除

似乎不是AOP注释。只是一个Spring注释。我的<code>切入点</code>不关心或检查注释。它使用updateOne(…)

更新03

甚至添加

@Aspect
@Component
@Transactional
@Order(0)
class PersonaRestControllerAspect {

不工作如何是预期的。

更新04

我有过

@EnableWebMvc
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

...

    @Override
    public Validator getValidator() {
        return validatorConfig.localValidatorFactoryBean();
    }

...

验证器的来源:

@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean(){
    LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
    localValidatorFactoryBean.setValidationMessageSource(rrbms);
    return localValidatorFactoryBean;
}

那个rrbms是一个ReloadableResourceBundleMessageSource实例,它加载许多. Properties文件,其中之一是"classpath:/com/manuel/jordan/验证/验证"

共有1个答案

於鸿羲
2023-03-14

这是预期的行为。如果您使用@Valated而没有附带的BindingResult参数,则永远不会调用该方法。如果数据无效,您会得到异常。毕竟这就是验证的全部意义。如果未调用该方法,那么您的建议也将不会被执行。

 类似资料:
  • 我试图测试我的Spring MVC控制器,但我不断收到与Thymeleaf模板相关的错误。我真的不想在控制器测试中处理模板错误,因为这不是我真正感兴趣的。当模板不存在时让测试失败是可以的,但现在我收到了与根据错误代码找不到消息相关的错误。 当我运行应用程序时,这个问题不存在。我一直在尝试弄清楚如何设置测试环境来解决这个问题,但在那里我找不到任何有效的方法。现在,我只是真的想让控制器代码正常工作。

  • 本文向大家介绍详解Spring MVC如何测试Controller(使用springmvc mock测试),包括了详解Spring MVC如何测试Controller(使用springmvc mock测试)的使用技巧和注意事项,需要的朋友参考一下 在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码。 1

  • 正在使用Spring MVC创建Restful Web服务... 下面是我的pom.xml: WEB-INF/web.xml: web-inf/mvc-dispatcher-servlet.xml: src/main/resources/database_db.xml: @Repository public class UserDAO{ } SRC/Test/Java: 这就像在print()语句

  • 龙果开源-后台管理系统 项目介绍 框架完全是基于Spring IO platform,绝对拥抱Spring,版本的依赖关系再不用担心。 前端基于 龙果开源-后台管理UI Roncoo AdminLTE,高端大气上档次。 实现了邮件发送功能,邮件增删改查功能 代码自动生成工具使用了龙果开源-Mybatis代码自动生成工具 项目愿景 根据实际项目的需求,实现一个适合由单应用扩展到多应用的架构。在项目的

  • 当使用mockito单元测试Spring mvc控制器时,如何注入道层对象。当使用SpringJUnit4ClassRunner类时,它总是使用@Spy注释给空指针异常。 示例代码: 在这个测试用例中,依次调用,它总是返回

  • 主要内容:1 XML配置方式,2 注解方式如果你使用 Spring MVC 来构建 Web 应用并对性能有较高的要求的话,可以使用 Fastjson 提供的FastJsonHttpMessageConverter 来替换 Spring MVC 默认的 HttpMessageConverter 以提高 @RestController @ResponseBody @RequestBody 注解的 JSON序列化速度。下面是配置方式,非常简单。

  • 大家好,我对thymeleaf和我的静态html页面有一个问题。更具体地说,我有一个spring mvc web应用程序,我也在使用spring security,在我的登录页面中,我想使用thymeleaf,这样spring security可以与另一端的客户端层通信吗?我不想在我的所有html页面中包括thymeleaf,因为我将使用AngularJs 我尝试将登录名放在templates文件

  • http://some-amazon-link:8080/the-war-name/login 现在我正在纠结如何在Spring MVC项目中添加“/the-war-name/”以及在哪里添加“/the-war-name/”。 它在 null