jmockit对静态函数和参数调用接口实现打桩2

单元测试中的打桩对象,主要有两种:
1、对象参数:在外部构造,作为参数传入调用的方法;
2、静态方法:在功能方法内部调用;
由于我们系统中有很多静态方法,所以前面选型的mock工具:jmock/easymock/gmock/mockito 就直接被淘汰,它们不支持这种能力
现在支持这种能力的mock工具只有JMockit,
但是,经过昨天和今天的测试,发现它使用起来还是比较复杂的,而且,它不能和groovy很好的兼容 !

下面是成功实现:就是结合使用JMockit和groovy两种能力,只使用JMockit的静态方法替换能力,剩下的全部使用groovy自身的map和expando能力
下面的例子是测试 ScheduleTargetImpl.deleteTarget方法的测试代码,两种能力都用到了
实现实例
public class ScheduleTargetImplTest {
@Test
public void testDeleteTarget() {
// 对TExpandedNElement 打桩
def element = [getProductid:{"pid"}, getProductTarget:{"pTarget"}] as TExpandedNElement
// 对TTarget 打桩
def Target = [getTargetID:{"vid"}] as TTarget
// 替换ContextUtils.getRequestMap 静态方法
Mockit.redefineMethods(ContextUtils, TargetMock)
// 替换AbstractTargetFactory.getInstance() 静态方法,并对返回对象的deleteTarget方法 打桩
Mockit.redefineMethods(AbstractTargetFactory, TargetMock1)

ScheduleTargetImpl impl = new ScheduleTargetImpl();
assertTrue impl.deleteTarget("token", element, Target);
}
}
class TargetMock {
public static Map getRequestMap() {
new HashMap()
}
}
class TargetMock1{
public static AbstractTargetFactory getInstance() {
[deleteTarget:{}] as AbstractTargetFactory
}
}

你可能感兴趣的:(单元测试,groovy)