`
mozhenghua
  • 浏览: 325215 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何将Spring配置文件已配置的类Mock

阅读更多

1问题:

手上在做一个历史遗留项目,整个项目有N个模块,我只负责其中一个子模块的功能的维护工作,项目的各个模块是通过spring来将各个模块耦合起来的。

启动项目已经有一个配置文件,并且已经打入了jar包。

为了精简我所描述的场景,避免引入不必要的复杂性。我将不介绍每个模块中的具体实现,重点只描述各个模块之间的依赖关系。

假设我所维护的模块是A,模块A运行需要依赖模块B,模块B是其他人开发的。这个项目在前期是是基于接口开发的,这是一个非常好的前提,这样,我轻而易举就能做些小动作了。以下是这个系统的类图(虽然简单,但是能说明问题)

Spring的配置文件“application-context.xml“是这样写的:

 


模块B在配置文件中的实现类已经写死了,在IModuleB的默认实现中是会去链接数据库,这样在测试过程中就需要去配置数据库连接,增加了测试的复杂度,所以很自然地就想到了用Mock技术,需要将ModuleB做成模拟对象。

 

2 问题解决:

首先很自然地就想到重写写一个配置文件,可以将moduleB的实现类改成模拟类,改成如下这种形式:

 

以上这个类只能在测试过程中使用,这样正式项目中和测试环境中使用的是两个spring配置文件,这两个配置文件中绝大数配置项是一样的只有ModuleB的配置是不一样的。这样的做法如果项目小的话没有问题,但是项目比较大的就会有问题。

而且,真实的项目中spring的配置文件远远比以上这个demo配置文件复杂许多,而且项目维护过程中经常会更改spring配置文件的配置,这样就需要保证测试环境的spring配置文件和正式项目中的spring配置文件保持同步,实际证明这是一件非常麻烦的事,难免会有遗漏。

现在的问题是,如何能不重写也不改写spring配置文件的前提下,将IModuleB接口Mock化。也就是测试环境和正式环境中只适用同一个application-context.xml配置文件。办法当然有,那就是利用Spring的org.springframework.beans.factory.config.BeanPostProcessor 接口,利用它在初始化spring容器的过程中会对spring容器中配置的所有Bean会进行拦截:

 

  1. postProcessBeforeInitialization 是在spring中配置的bean初始化之前调用的,如果配置的class实现了InitializingBean的afterPropertiesSet的方法,那就会在这bean调用afterPropertiesSet方法前调用该方法
  2. postProcessAfterInitialization 这个方法会是在InitializingBean调用了afterPropertiesSet这个方法之后来执行

如果配置的bean没有实现InitializingBean这个类的话,无论实现哪个方法都无所了。

要将spring配置项中的对象mock的话,只要在postProcessBeforeInitialization方法上作文章,方法的第一个参数bean是spring容器中配置的bean,spring在实例化bean并且为其设置好依赖之后将这个对象传到post*方法中,原则上需要将这个对象作为返回值返回给容器,但是我们为了mock这个类,我们可以在post*方法中创建一个Mock对象,将这个mock对象作为返回值返回,如果移花接木一般在这里将spring容器中的实现类给改了。

以下是改动之前的项目启动代码:

 


现在对他进行改动:

 

 

 

以上最核心的代码是以下这段:

判断被拦截的bean的name属性是否等于“moduleB”,如果相等的话就是要拦截的目标,就实例化一个mock对象,将他返回。

3 总结:

以上利用BeanPostProcessor接口,在spring容器初始化过程中对容器中的bean进行拦截的方法,将容器中的bean进行mock,这个方法的好处是:

  1. 测试环境和正式环境共用一个spring配置文件,减少配置维护工作。
  2. spring配置中有任何改动马上可以通过测试验证。

在代码中能够利用spring的机制开创建mock对象,完全依赖于前期代码是面向接口开发的,如果不是这样的话,根本没有办法做Mock对象。在项目中使用面向接口开发,虽然会增加代码维护量,也许在项目前期好处不是很明显,但是在项目维护期会给我们带来方便。类似的例子还有很多,我遇见过一些项目开发前期为了赶进度,方便而放弃了一些软件开发的一些基本原则(ocp原则,里氏替换原则,面向接口开发原则等等。。。),导致项目开发到后期很难维护,造成堆代码的局面。

所以,在项目开发过程中,我们前期我们您可多花一些“无用功”,项目后期我们一定会受益的。




  
  
  • 大小: 19.5 KB
分享到:
评论
1 楼 Sweblish 2012-02-03  
学以致用,基础知识很扎实,佩服!

相关推荐

    spring-mock.jar

    本文将详细探讨Spring Mock的核心概念、使用方法以及它在实际开发中的价值。 一、Spring Mock简介 Spring Mock是Spring框架的一个扩展,它允许开发者在测试过程中创建和配置模拟对象,以代替真实的依赖,从而减少...

    java单元测试 spring mock的使用

    在PMSTestCase的setUpBeforeClass方法中,创建了XmlWebApplicationContext,设置了配置文件的位置,创建了GenericWebApplicationContext,并将其设置为父容器。然后,加载了配置文件,注册了DAO和Manager类。最后,...

    spring配置jar包详解

    提供了访问配置文件、创建和管理bean以及Inversion of Control/Dependency Injection (IoC/DI)操作的相关类。如果你的应用只需要基本的IoC/DI支持,那么引入spring-core.jar和spring-beans.jar就足够了。此jar包...

    Spring Junit单元测试加载配置文件失败问题

    当我们在单元测试中使用@ContextConfiguration加载配置文件时,Spring Junit将只能找到src/test/resources目录下的配置文件,无法找到src/main/resources目录下的配置文件。这将导致单元测试时无法注入类,无法正常...

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

    本项目的核心是将Spring Boot和MyBatis框架结合,来改造一个现有的Mock平台,以提供更加高效和灵活的模拟服务。 首先,Spring Boot是基于Spring框架的一个微服务开发框架,它的主要优点在于简化了Spring应用程序的...

    spring-struts1-strust2-hibernate 核心包介绍

    这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行 Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC /DI支持,引入spring-core.jar及...

    spring jar 包详解

    - **功能简介**:此 Jar 包包含了访问配置文件、创建和管理 Bean 以及进行依赖注入相关的所有类。 - **应用场景**:用于实现基本的 IoC/DI 支持。 - **依赖关系**:需要 `spring-core.jar` 和 `cglib-nodep-2.1_3....

    最新最全的spring开发包

    这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI支持,引入spring-core.jar及...

    Spring Boot环境配置

    `src/main/resources`则存放配置文件,如`application.properties`或`application.yml`,这里可以定制Spring Boot的配置,比如服务器端口、数据库连接信息等。 在开发环境中,我们可以使用集成开发环境(IDE)如...

    百灵报表 dome mock 实例 hibernate spring struts2 struts

    4. **Spring整合**:了解如何使用Spring配置文件进行依赖注入,管理数据库连接和事务。 5. **Struts2/Struts** 控制器:编写Action类,处理HTTP请求,调用业务逻辑,然后返回结果到视图。 6. **Mock对象测试**:使用...

    Spring的Java配置方式Demo

    1. `@Configuration`:这是Java配置的核心注解,标记在一个类上,表明该类是一个配置类,可以替代传统的XML配置文件。配置类内部通常会包含多个`@Bean`注解的方法,这些方法将用于创建并管理Bean对象。 2. `@Bean`...

    spring test学习2

    5. `Mockito`集成:Spring Test与Mockito库结合,可以创建和配置mock对象,隔离被测试代码。 三、测试类型 1. 单元测试:关注单个类或方法的行为,通常使用`@Test`注解标记测试方法,配合`@Autowired`注入依赖,用`...

    Spring下载与配置.pdf

    首先,将这两个库的目录移动到`myspring/lib`下,然后创建一个日志配置文件`log4j.properties`,放置在`src`目录下,定义日志级别和输出格式。例如: ``` log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=...

    SSH(struts2,Hibernate,Spring)整合及测试亲测可用所需jar包

    整合过程中,需要在Struts2的配置文件中添加Spring插件,同时在Spring配置文件中定义数据源、SessionFactory以及相关的DAO和Service。 **测试**: 在SSH框架下,单元测试和集成测试都非常重要。JUnit是常用的单元...

    Spring 2.5 jar 所有开发包及完整文档及项目开发实例

    这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI支持,引入spring-core.jar及...

    spring boot

    Spring Boot主要使用`application.properties`或`application.yml`作为全局配置文件,它提供了强大的属性绑定功能,可以直接将配置文件中的属性映射到Java对象。 ### 5. 健康检查与Actuator Actuator是Spring Boot...

    intellij-spring-assistant-0.11.0.zip

    其次,该插件还支持对Spring Boot配置文件的智能感知。在`application.properties`或`application.yml`中,Spring Assistant可以提供属性的自动补全,帮助开发者快速找到并配置所需的Spring Boot属性。这不仅可以...

    spring4.3.9相关jar包文件

    Spring Beans负责管理对象的生命周期和依赖注入,ApplicationContext则提供了一个高级的容器,可以加载配置文件,创建和管理Bean,以及处理消息源等。 2. **AOP(面向切面编程)**:Spring的AOP模块支持在不修改...

    spring2.0.8jar包

    开发者可以通过XML配置文件或注解来定义Bean及其依赖关系。此外,Spring Core还包含资源处理、事件传播以及AOP(面向切面编程)的基础支持。 2. **Spring Bean**: 在Spring 2.0.8中,Bean是应用程序中的核心组件...

Global site tag (gtag.js) - Google Analytics