`

使用spring aop 简化mock设计实现

阅读更多

有时候为了去掉对外部系统的依赖, 我们需要针对外部依赖的接口创建一个mock实现类, 当然里面都是空实现, 如果有多个的话, 可能需要写很多的mock实现类, 我们在测试的时候, 发现可以通过spring aop来进行简化, 使用一个aspect来替代多个mock实现. 具体做法如下:
首先是aop的配置文件, 如下:

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/util 
         http://www.springframework.org/schema/util/spring-util-2.0.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
	default-autowire="byName">

	<!-- aop 拦截器配置 -->
	<aop:aspectj-autoproxy />
    <bean id="mockAspect" class="com.mysoft.mock.aspect.MockAspect" lazy-init="false">
    </bean>
	<aop:config>
       <aop:aspect ref="mockAspect">
           <aop:around pointcut="execution(* com.mysoft.manager.impl.DefaultCategoryManager.*(. .))" method="invokeOfCategory"/>
           <aop:around pointcut="execution(* com.mysoft.manager.PropertyManager.*(. .))" method="invokeAndReturnNull"/>
           <aop:around pointcut="execution(* com.mysoft.manager.impl.TxtFileManager.*(. .))" method="invokeAndReturnNull"/>
           <aop:around pointcut="execution(* com.mysoft.manager.KeywordsChecker.checkNormalKeywords(. .))" method="invokeAndReturnString"/>
           <aop:around pointcut="execution(* com.mysoft.manager.KeywordsChecker.checkFixKeywords(String, long)) and args(text, categoryId)" method="checkFixKeywords" arg-names="join,text, categoryId"/>
       </aop:aspect>
	</aop:config>
 

这里主要配置了一个用来放实际执行的方面类:MockAspect, 然后是一些pointcut的表达式配置.也就是告诉spring aop, 当碰到某个类, 某个方法的时候, 去执行MockAspect中对应的某个方法.
MockAspect的内容如下:

public class MockAspect implements BeanFactoryAware {
    private BeanFactory beanFactory;

    public Object invokeOfCategory(ProceedingJoinPoint join) throws Throwable {
        CategoryManager categoryManager = (CategoryManager) beanFactory.getBean("categoryManagerMock");
        MethodInvocationProceedingJoinPoint call = (MethodInvocationProceedingJoinPoint) join;
        Signature signature = call.getSignature();
        MethodSignature ms = (MethodSignature) signature;
        String methodName = signature.getName();

        Method method = categoryManager.getClass().getMethod(methodName, ms.getParameterTypes());
        return method.invoke(categoryManager, join.getArgs());
    }

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    /**
    *
    * 一个默认的处理, 什么也不做
    *
    * @param join
    * @return
    * @throws Throwable
    */
    public Object invokeAndReturnNull(ProceedingJoinPoint join) throws Throwable {
        return null;
    }

    public String invokeAndReturnString(ProceedingJoinPoint join) throws
            Throwable {
        return "";
    }

    /**
    * 对{@link String
    com.mysoft.manager.KeywordsChecker#checkFixKeywords(String,
    long)}方法进行切面
    * @param join
    * @param text
    * @param categoryId
    * @return
    * @throws Throwable
    */
    public String checkFixKeywords(ProceedingJoinPoint join, String text,
            long categoryId)
            throws Throwable {
        if ("abc".equals(text)) {
            return "def";
        }
        return null;
    }
}
 

这里还需要提到的一个东东, 就是实现了BeanFactoryAware 接口, 主要是为了在一起运行所有的test case的时候, 有时候里面有几个bean需要替换为mock的实现类(比如这里的categoryManagerMock), 这里我们做了一个switch的动作, 让他不是去调用具体的类, 而是我们定义的一个mock实现类.

当然这种做法也不要滥用, 适可而止, 针对一些简单的, 大量的mock, 还是有一定参考意义的.

分享到:
评论

相关推荐

    springAop多数据源

    总结来说,"springAop多数据源"项目涉及到Spring框架的多数据源配置、JdbcTemplate的使用、面向切面编程的应用,以及使用JUnit进行测试。理解并掌握这些技术对于构建灵活、可扩展的Java应用程序至关重要。在实践中,...

    Spring Boot与MyBatis结合 实现对mock平台改造

    通过Spring Boot的AOP(面向切面编程)和拦截器机制,可以方便地实现这些功能。同时,对于复杂的Mock需求,可以利用Mockito等单元测试框架,或者使用专门的Mock服务工具,如WireMock,进一步提升Mock平台的功能和...

    spring技术内幕第2版深入解析spring架构与设计原理

    在深入解析Spring技术内幕第2版中,会详细探讨Spring框架的核心架构与设计原理,Spring作为一个轻量级的Java平台,提供了全面的编程和配置模型,是企业级Java应用程序开发中广泛使用的技术之一。 Spring的核心特性...

    spring-framework-reference-4.3.26.pdf

    Spring框架的文档详细记录了其架构设计、各模块功能以及如何利用Spring开发企业级应用。 在SpringFrameworkReferenceDocumentation4.3.26文档中,首先介绍了Spring框架的概述,包括开始使用Spring的指南、框架简介...

    spring-mvc开发所有jar包【4.3.4】

    在本压缩包中包含的是Spring MVC 4.3.4版本的jar包,这是一个稳定且广泛使用的版本。这个版本的Spring MVC为非Maven项目提供了方便,避免了开发者为了集成Spring框架而手动下载和配置各种依赖的麻烦。 1. **spring-...

    Spring2.0.8源码包

    在2.0.8版本中,Spring AOP主要通过代理模式实现,包括JDK动态代理和CGLIB代理,这两种代理方式在源码中都有详细的实现。 `spring-web`和`spring-webmvc`模块是针对Web应用的,前者提供了HTTP请求的处理,如Servlet...

    spring2.0.8jar包

    Spring框架是Java开发中不可或缺的一部分,它以其模块化、松耦合的设计理念,极大地提高了开发效率和代码质量。本文将详细解析Spring 2.0.8版本中的关键知识点,包括核心组件、Bean管理以及Web支持。 1. **Spring ...

    spring jar 包详解

    如果项目是一个完整的 Web 应用,并且将全程使用 Spring 框架,推荐使用单个完整的 `spring.jar` 文件,因为它包含了除 `spring-mock.jar` 外的所有 Jar 包内容。 如果只需要使用 Spring 的 IoC/DI 容器特性,则只...

    Spring5.1中文参考指南.pdf

    - **设计哲学**:强调轻量级、非侵入性以及对POJO的支持,通过IoC(Inverse of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)等技术实现了这一目标。 - **反馈与贡献**:鼓励社区成员提出...

    Spring 2.0 中文用户指南

    Spring框架以其依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)的核心特性,极大地简化了Java应用程序的开发,特别是对于企业级应用。 一、Spring框架概述 Spring是一个...

    spring3.0开发包

    `cglib-nodep-2.1_3.jar` 是一个代码生成库,Spring使用它来动态创建子类以实现AOP代理和Mock对象。 `org.springframework.aop-3.0.3.RELEASE.jar` 包含了Spring的AOP模块,提供切面的定义、匹配和执行,是实现面向...

    Spring Framework Reference 4.1.x Web MVC部分 pdf

    - **灵活性**:Spring Web MVC框架非常灵活,用户可以使用任何对象作为命令对象或者表单支持对象,而无需实现特定的接口或继承特定的类。 - **数据绑定**:Spring的数据绑定机制非常强大,能够自动将请求参数绑定到...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)

    由于提供的文件内容中并没有包含实质性的技术内容,仅是重复的网址,并没有涉及《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》一书的具体知识,我将基于书名和对Spring框架的理解,详细阐述Spring的...

    spring-framework基本包

    Spring 的核心设计理念是依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)。在这个“spring-framework基本包”中,我们主要探讨 Spring 框架的基础内容,包括 IoC 容器、...

    Spring框架(spring-framework-5.2.6.RELEASE)的jar包

    - `spring-aop-5.2.6.RELEASE.jar`:包含AOP相关的实现。 - `spring-beans-5.2.6.RELEASE.jar`:Bean工厂和bean管理相关功能。 - `spring-context-5.2.6.RELEASE.jar`:扩展了Core Container,提供应用上下文和服务...

    spring-2.5常用项目包

    而如果你的项目需要实现面向切面的特性,那么Spring AOP则应该被包含在内。 “myjar-spring”可能指的是一个自定义的Spring库,它可能包含了对Spring框架的一些特定定制或者额外的功能,以适应特定项目的需求。在...

    spring2.0技术手册_林信良_源代码

    Spring AOP使用代理模式实现,可以是JDK动态代理或CGLIB代理。 3. **bean的定义与管理**:在Spring中,应用组件被定义为bean,它们可以通过XML、注解或者Java配置来定义。Bean可以有各种作用域,如单例、原型、请求...

    spring4.3.3.zip

    在"spring-aop"目录下,通常会包含实现AOP功能的类库,如spring-aop.jar,它提供了对切面、通知、代理等概念的支持,使得代码更加模块化,提高了代码的复用性和可维护性。 2. **spring-jdbc-tx**: 这个部分涉及到...

    spring4.1.7源码

    在`org.springframework.jdbc`包下,你可以看到Spring如何简化了JDBC的使用。同时,`org.springframework.orm`和`org.springframework.oxm`包分别处理ORM和OXM的集成。 4. **MVC(Model-View-Controller)** ...

    spring jar包最新版

    使用Spring框架时,开发者通常会将所有必要的jar文件(如spring-context、spring-aop、spring-web等)添加到项目的类路径中。"spring-framework-4.3.8.RELEASE"压缩包中的内容应该包括这些jar文件,以及其他相关的...

Global site tag (gtag.js) - Google Analytics