单元测试中的打桩对象,主要有两种:
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
}
}
分享到:
相关推荐
可以用来Mock JAVA代码中的静态方法
本教程主要探讨的是如何在LabVIEW中静态和动态地调用子VI,以及这两种方法的不同特性。 一、静态调用子VI 静态调用子VI是在编译时确定的,即在设计阶段就固定了将要调用的子VI。这种方式的优点在于能够进行早期...
在C#编程中,获取调用函数的参数名称和值是一项常见的需求,特别是在日志记录、调试或动态处理参数时。下面将详细讲解如何在C#中实现这一功能。 首先,我们要了解C#中的反射机制。反射是.NET框架提供的一种强大工具...
在C++编程中,通过函数指针调用非静态成员函数是一种高级技巧,主要用于实现回调、动态绑定等场景。本文将详细探讨如何在Visual C++ 6.0 (VC6.0) 和Borland C++ Builder 6.0 (BCB6.0) 中实现这一功能。 #### 一、...
标题 "火山PC内存加载dll及静态方法参数回调函数" 涉及到的是Windows系统下动态链接库(DLL)的加载技术以及静态方法与参数回调的实现。在Windows编程中,DLL是一种可重用的代码库,允许多个应用程序共享同一段代码...
6. **传递参数和接收结果**:在Delphi中,你可以使用上述函数,传入Java接口名、方法名以及参数,调用Java方法并获取返回值。 ```delphi const ClassName = 'com/example/MyJavaClass'; MethodName = '...
总结,DLL在Windows编程中扮演着重要角色,通过静态和动态调用来实现代码的复用和分发。静态调用适用于对性能要求较高且不需频繁更新的情况,而动态调用则适合于需要灵活加载和更新的场景。理解并熟练掌握这两种调用...
2. **连接信号和槽**:在静态函数中,调用中介对象的`emitStaticSignal()`方法来发送信号。 ```cpp void myStaticFunction() { // 假设已经有一个StaticSignalEmitter的实例 StaticSignalEmitter* signalEmitter ...
在开发中,我们通常会遇到两种调用方式:动态调用和静态调用。这两种方法各有特点,适用于不同的场景。 静态调用是通过在项目中添加Web引用或者服务引用来实现的。这种调用方式在编译时就已经确定了服务接口,因此...
本文将深入探讨如何利用静态变量对函数访问次数进行计数,以及这种方法背后的原理和注意事项。 首先,我们需要理解静态变量的概念。在C++或类似的编程语言中,静态变量有以下特点: 1. 生命周期:静态变量在整个...
DLL接口函数实际上是DLL文件中定义的一系列公开函数,这些函数具有明确的调用约定和参数类型,使得其他程序能够安全地调用它们。DLL文件不包含执行入口点,它仅提供服务,由需要这些服务的可执行文件(EXE或另一个...
在C++编程语言中,类和对象的概念是其面向对象编程(OOP)的核心部分,而类中函数的调用则是实现对象操作的关键机制。本文将深入解析C++中类中函数调用的基本原理、语法结构及其实现方式,通过一个具体的代码示例来...
4. 调用DLL函数:由于已静态链接MFC,可以直接像使用本地函数一样调用DLL中的函数,无需`LoadLibrary`和`GetProcAddress`。 两种调用方式的比较: - 动态调用占用内存小,因为多个进程可以共享同一个DLL实例。但...
在探讨继承中子类与父类构造函数及静态块的执行顺序时,我们首先需要理解构造函数和静态块的基本概念及其在Java中的作用。...这不仅有助于避免潜在的初始化问题,还能帮助开发者更好地设计和实现面向对象的程序结构。
为了使DLL能够调用应用程序的函数,我们需要确保回调函数的声明和实现符合DLL的预期。这通常涉及到函数调用约定(如`__cdecl`、`__stdcall`等)和参数类型的一致性。例如,DLL可能有一个函数原型如下: ```cpp ...
在 C 或 C 中与委托最接近的是函数指针,但函数指针只能引用静态函数,而委托可以同时引用静态方法和实例方法。在后一种情况中,委托不仅存储对方法入口点的引用,还存储对调用其方法的对象的引用。与 C 函数指针...
在我们的示例代码中,我们定义了一个类WinHook,具有一个成员变量value和一个成员函数HookProcess2。我们尝试将HookProcess指向HookProcess2,但是编译失败,提示类型不能转化。这是因为类成员函数 HookProcess2 不...
2. 函数调用关系模型:这是指对程序中函数间调用关系进行建模,形成的数据结构。该模型能展示函数之间的依赖和调用顺序,是理解程序结构和执行流程的重要工具。 3. 覆盖导向测试用例自动生成:这是一种软件测试方法...
3. **静态分析**:生成函数调用关系图通常涉及对源代码进行静态分析。静态分析是在不实际运行代码的情况下检查其结构和特征的方法,这可以用于发现潜在问题、依赖关系等。 4. **图形化工具**:为了可视化函数调用,...
一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...