使用jmockit和autobeanInject

Download Report

Transcript 使用jmockit和autobeanInject

JMockit
&
AutoBeanInject
吴大瑞
2010-03-16
大纲
 使用JMockit
•
•
•
•
基于状态的使用
基于行为的使用
与spring集成
部分mock的实现
 无需配置文件,自动注入spring bean
怎么办?
 工具类DateUtil
怎么办?
 DateUtil实现的功能
• 格式化当前时间
• String currDateStr() ,返回当前时间的“yyyy-MM-dd”格式
串
• String currDateTimeStr(),返回当前时间的“yyyy-MM-dd
mm:hh:SS”格式串
 DateUtil类的特点
• static的静态工具类
• Final类
• Final方法
怎么办?
 如何测试DateUtil类
传统Mock的限制
 传统mock框架实现机制
• java.lang.reflect.Proxy
• cglib, asm等工具静态改变class
 传统mock框架的约束
•
•
•
•
•
依赖于DI机制(对静态类无能为力)
对final类和方法无能为力
对静态的方法无能为力
实现部分mock比较困难
所有被mock的方法必须是public类型的
神奇的jmockit
 突破所有限制
 实现机制java.lang.instrument
 运行要求:jdk5 –javaagenct:upath/jmockit-0.997.jar
jdk6 无要求
神奇的jmockit
神奇的jmockit
jMockit基于状态的测试
 基于状态的测试
•
•
•
•
内联类@MockUp
Mockit.setup(业务类class, mock Object)
Mockit.setup(业务类class, mock class)
使用@ mockit.UsingMocksAndStubs
 注意点
• Mock方法前加annotation @Mock
• @mockit.Mock 非彼
@org.jtester.unitils.jmock.Mock
UsingMocksAndStubs示例
 注意红色下划线地方
•
•
•
•
Mock的方法必须声明为public
Mock的方法前面要有annotation @Mock
MockClass属性realClass要指定
UsingMocksAndStubs属性要指定
jMockit基于行为的测试
 示例Service功能
 基于行为的测试
• @Mocked
• new Expectations()匿名类
jMockit集成spring
 如何把Mocked对象注入spring容器
限制:由于spring没有实例化真正的bean,所
以没法做到部分mock。
jMockit集成spring
 如何部分mock spring bean
 2个注意点
• 在@Mocked的属性methods中指定要mock的方法.
• userDao的类型是实现类,而非接口类。
jMockit集成spring
 另一种形式
总结一下jmockit的用法
 静态mock
• 定义匿名类 new MockUp<T>()
• 使用MockIt.setup(u实现类,u mock类) (几种变体)
• 使用MockClass和@UsingMocksAndStubs
 动态mock
• @Mocked
• 在匿名类Expectations中指定行为
 和spring集成
• @MockedBean,全部mock
• 部分mock
自动配置spring bean
 @SpringApplicationContext
• 常规方式加载spring bean
 @MockedBean
• 往spring容器中注入Mock Bean
 @AutoBeanInject
• 极大的减少你的配置工作,让你把精力放在测试业务方
法上。
简单实用
@AutoBeanInject使用
 @AutoBeanInject
从这里开始,根
据规则,查找实
现和依赖
 注入限制
• 只针对无参构造函数的spring bean
• Spring框架自身提供的bean必须手动声明
@AutoBeanInject属性
 maps 声明接口类和实现类class的映射规则
• @BeanMap数组
• intf 接口类规则
• impl 实现类规则
 excludeProperties
• 排除自动注入的set属性(数组)
 excludePackages
• 排除自动注入的属性类型规则(数组)
Q&A
Q&A