使用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