知识大全 利用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技术 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java的RMI
知识大全 Spring2.5整合ActiveMQ 5.2(P2P文本消息)
Spring2.5整合ActiveMQ5.2(P2P文本消息) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
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存储过程简化数据库操作 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 利用Java存
知识大全 Java Reflection (JAVA反射)详解
JavaReflection(JAVA反射)详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
C#利用反射简化给类字段赋值 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这个例子主要的思路是