单元测试中的打桩对象,主要有两种:
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
}
}
分享到:
相关推荐
它允许开发人员对全局函数、静态函数、类成员函数甚至是类的虚成员函数进行打桩,以支持单元测试。使用这样的工具,开发者可以更有效地编写测试用例,确保代码质量,并且对程序的运行有更深入的理解。 总的来说,...
- **记录调用**:桩函数可以记录函数调用的次数、参数等信息,用于验证代码逻辑。 3. **C++中的函数打桩** 在C++中,有多种实现函数打桩的方式: - **宏**:通过宏定义,可以轻松创建简单的桩函数,但这可能导致...
基于gmock,可以在不更改源代码的情况下模拟全局函数、成员函数、类静态函数。 是 OneNote 上的文档和设计笔记宿主。 你好,世界: string func () { return " Non mocked. " ; } TEST (HelloWorld, First) { ...
函数钩子允许开发者在调用原函数之前或之后插入自定义代码,实现对系统行为的监控或改变。这种技术广泛应用于调试、性能分析、安全检测等领域。Detours通过将函数调用重定向到用户定义的替代函数来实现这一目标,而...
gmock-global 这个仅标头的库为全局函数实现了功能。 介绍 是用于编写模拟类的C ++框架。 创建模拟对象以模拟方法... 例如,要对模拟函数multiply两个double参数和double结果,必须编写声明: MOCK_GLOBAL_FUNC
2. **静态函数的打桩** 静态函数的可见性仅限于其所在的源文件,这使得在其他文件中直接对其进行单元测试变得困难。为了解决这个问题,可以在源文件中创建一个非静态的包装函数,如`ut_foo()`,它调用原始的静态...
- 库打桩是指在程序运行时替换或插入函数调用,常用于动态链接阶段,以便于调试、性能分析或系统监控。题目中指出,C选项和D选项关于"静态链接/运行时"和"动态链接/运行时"的理解可能存在歧义,实际上,库打桩主要...
你的设计应该对手头的问题有针对性,同时对将来的问题和需求 也要有足够的通用性。 你也希望避免重复设计或尽可能少做重复设计。有经验的面向对象设计者会告诉你,要一下子就得到复用性和灵活性好的设计, 即使不是...
同时,对`dex`、`class`、`method`等的分析将更加细致,结合静态分析和动态调试,以实现更全面的保护。此外,源码分析还可以帮助识别隐藏的恶意行为,以及潜在的系统安全漏洞。 总之,从Android系统源码的角度进行...