知识大全 利用spring2.5和Reflection简化测试中的mock[3]

Posted

篇首语:走路不怕上高山,撑船不怕过险滩。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 利用spring2.5和Reflection简化测试中的mock[3]相关的知识,希望对你有一定的参考价值。

利用spring2.5和Reflection简化测试中的mock[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  < bean id= Helloword class= Helloworld autowire= byType > 现在看上去是不是好多了?嗯 对象间的依赖关系和mock对象的创建都由 Spring 来替我们维护 再也不用费心了 不过 reset/verify 是不是还是看上去那么舒服?我们观察一下 通常为了简化对 mock 对象的验证 我们对 Test 类中使用到的 mock 对象都是一起reset/replay /verify 要是能有resetAll()/replayAll()/verifyAll()方法就好了 也省得不同的 Test 类写一大串对不同的 Mock 对象验证的方法 OK 这时候我们就要借助 Reflection 来完成这项任务了 通过 Reflection 得到 Test 类中所有加上 @Autowired 声明的成员变量 验证它们是不是由代理或者字节码增强 从而得到该 Test 类的所有由 Spring 创建的 mock 对象 进行 reset/replay/verify

  根据这个思路 我们引入这样一个 mock 测试的Helper类

import static easymock EasyMock *;

final class MockTestHelper

    public static void resetAll(Object testObject)         reset(getDeclaredMockedFields(testObject));   

    public static void verifyAll(Object testObject)         verify(getDeclaredMockedFields(testObject));   

    public static void replayAll(Object testObject)         replay(getDeclaredMockedFields(testObject));   

    private static Object[] getDeclaredMockedFields(Object testObject)         Field[] declaredFields = testObject getClass() getDeclaredFields();        List declaredMockedFields = new ArrayList();        for (Field field : declaredFields)             if (field isAnnotationPresent(Autowired class))                 boolean isAccessible = field isAccessible();                try                     field setAccessible(true);                    Object value = field get(testObject);                    if (isClassProxy(value getClass()))                         declaredMockedFields add(value);                                    catch (IllegalAccessException e)                     e printStackTrace();                                finally                     field setAccessible(isAccessible);                                            return declaredMockedFields toArray();   

    private static boolean isClassProxy(Class clazz)         String className = clazz getName();        return className contains( $Proxy ) || className contains( $$EnhancerByCGLIB$$ );   

  好了 有了这么一个 Helper 类 写 mock 对象的Test 类就简单了许多 还是以上面的例子为例 经过这么一重构 变成如下

  这样看起来就好多了 以后不管在 Test 类里面添加多少个 Test 类需要的 mock 对象 我们都不需要再修改对 mock 对象的验证了 Helper类会自动< bean id= Helloword class= Helloworld autowire= byType >帮我们完成所有的工作 & lt br />综上所述 使用Spring 里面引入的 Test Cntext 和 annotations 的确帮助我们减轻了大量的测试代码量 而且让我们的 Test 类更加POJO 更易于让人理解其职责 成为对 feature 的 specification 而 Reflection的小技巧 则能很方便的改进原来代码中不够动态的地方 进一步简化代码量和维护难度 当然我们可以看到 即使这样 代码里面还是有不少resetAll/replayAll/verifyAll的地方 作为 mock 框架带来的一些约束 我们没有办法来省略 这里推荐一种新的 mock 框架—— mockito 是有我的外国同事开发的 它不仅把mock stub spy等double的概念区分更清楚 而且让我们的 mock 测试更易写 更易读

cha138/Article/program/Java/ky/201311/29008

相关参考

知识大全 利用spring2.5和Reflection简化测试中的mock[1]

利用spring2.5和Reflection简化测试中的mock[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶

知识大全 Java中利用Reflection API优化代码

Java中利用ReflectionAPI优化代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Spring2.5整合RMI技术

Spring2.5整合RMI技术  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java的RMI

知识大全 Spring2.5整合ActiveMQ 5.2(P2P文本消息)

Spring2.5整合ActiveMQ5.2(P2P文本消息)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 Spring2.5注释驱动与基于注释的MVC

Spring2.5注释驱动与基于注释的MVC  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Sp

知识大全 Spring2.5访问Session属性的四种策略

Spring2.5访问Session属性的四种策略  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 通过Spring2.5对单元测试的Annotation支持进行TDD开发

通过Spring2.5对单元测试的Annotation支持进行TDD开发  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们

知识大全 利用 Java 存储过程简化数据库操作

利用Java存储过程简化数据库操作  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  利用Java存

知识大全 Java Reflection (JAVA反射)详解

JavaReflection(JAVA反射)详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 C#利用反射简化给类字段赋值

C#利用反射简化给类字段赋值  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这个例子主要的思路是