`
az12xc34
  • 浏览: 13660 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jmokit 静态方法

阅读更多
前言
Jmockit是一个超强大的ut mock工具, 与其他mock工具最大的特点是可以对final类, 静态方法进行mock! 这是其他mock工具不可比的. 这也成为我们选它做ut的原因. 多种mock工具特色比较:
http://code.google.com/p/jmockit/wiki/MockingToolkitComparisonMatrix

一 jmockit加载注意事项
1 由于jmockit用到了jdk1.5的instrument特性, 所以必需用1.5以上的jdk运行
2 如果junit版本是4.x, 需要4.8以上的版本, 而且在设置classpath时jmockit.jar的路径要设置在junit.jar前. 这样保证使用jmockit的runner加载junit
3 jmockit还自带了ut覆盖率统计工具, 将jmockit-coverage.jar的路径加入classpath, 每次ut完成就会自动生成覆盖率报告, 方便省心.

二 jmockit实用技巧之MockUp类应用
Jmockit提供了多种mock方式共开发者使用, 但给我感觉最有用的一个类就是MockUp. 用它几乎能完成所有需要mock的操作:
<!--[if !supportLists]-->a)       <!--[endif]-->mock接口. 使用MockUp.getMockInstance()方便mock接口, 特别是定义了多个方法的接口. 手工打桩需要写一个此接口的假实现, 但测试中只调用了接口的一个方法, 造成了其他没调用方法还要写一堆没用的实现. 用了MockUp打桩就只关注需要mock的方法即可:
package demo.jmockit;

public interface IService {
    void doSth();

    void doOtherthing();
}
接口中有两个方法, 使用Mock返回一个mock对象时只关注被调用的方法doSth()即可:
package demo.jmockit;

import mockit.Mock;
import mockit.MockUp;
import mockit.Mockit;

import org.junit.Test;

public class TestCase {

    @Test
    public void testSth() throws Exception {
        IService service = new MockUp<IService>() {
            // 需要mock哪个方法就只写哪个方法的mock实现, 其他方法都可以忽略
            @Mock
            public void doSth() {
                System.out.println("this is mock implement");
            }
        }.getMockInstance();

        // 调用mock方法
        service.doSth();

        // 最后做还原动作, 确保用例之间不相互影响. 也可以放到test case的teardown方法中
        Mockit.tearDownMocks();
    }
}


<!--[if !supportLists]-->b)      <!--[endif]-->mock final类或静态方法. 对于final类或静态方法, 其他mock工具基本没有好的办法, 但用MockUp就非常简单:
package demo.jmockit;

public class Utils {
  
    public static String getFormatStr()throws Exception{
        return "YYYY-mm-dd HH:MM:SS";
    }
}

package demo.jmockit;

import mockit.Mock;
import mockit.MockUp;
import mockit.Mockit;

import org.junit.After;
import org.junit.Test;

public class TestCase {
    @Test
    public void testMockStaticMethod() {
        // 打印mock前返回值
        System.out.println(Utils.getFormatStr());

        new MockUp<Utils>() {
                     //除了static关键字, 其他方法定义内容保持与被mock方法一致(包括异常定义)
            @Mock
            public String getFormatStr() throws Exception {
                return "OtherFormat: dd-mm-YYYY";
            }
        };
        // 打印mock后返回值
        System.out.println(Utils.getFormatStr());
    }
  
    @After
    public void tearDown() {
        // 最后做还原动作, 确保用例之间不相互影响.
        Mockit.tearDownMocks();
    }
}
分享到:
评论

相关推荐

    C#静态方法与非静态方法的比较

    ### C#静态方法与非静态方法的比较 在C#编程语言中,静态方法与非静态(实例)方法是两种非常重要的方法定义方式。这两种方法各有特点,在不同的场景下使用可以带来不同的效果。 #### 一、概念理解 **1. 静态方法...

    静态(static)方法重写(override)

    ### 静态(static)方法与重写(override) #### 一、概念解析 在面向对象编程语言中,如Java,方法重写(override)是一种重要的特性,它允许子类提供一个与父类相同签名的方法实现。这种方法的实现允许在运行时...

    Java中的静态变量静态方法静态块与静态类.docx

    Java 中的静态变量、静态方法、静态块和静态类 Java 中的静态变量、静态方法、静态块和静态类是 Java 编程语言的四个重要概念,它们之间存在着紧密的关系。下面将对这四个概念进行详细的介绍。 一、静态变量...

    静态方法同步 与 非静态方法同步

    本篇文章将深入探讨“静态方法同步”与“非静态方法同步”的差异、应用场景以及它们如何影响程序的并发性能。 首先,我们来了解什么是同步。在Java中,同步是通过`synchronized`关键字实现的,它用于确保同一时间...

    Java中的Static块与静态方法

    在Java编程语言中,`static`关键字扮演着至关重要的角色,它被用于声明类成员(如变量、方法)为静态的。静态成员不依赖于任何特定的对象实例,而是与类本身绑定,这意味着无论该类有多少个实例,静态成员只会有一份...

    静态成员与静态方法

    静态成员与静态方法 静态成员变量是一种特殊类型的成员变量,它可以在不创建类的对象的情况下使用,並被所有该类的实例所共享。静态成员变量的特点是,它可以在不创建类的对象实例的情况下使用,並且所有该类的实例...

    利用PowerMock模拟静态方法和私有方法的示例

    然而,有些情况下,正常的单元测试框架可能无法覆盖到所有的情况,比如静态方法和私有方法的测试。这时,我们就需要引入特殊的工具,如PowerMock。本文将详细介绍如何利用PowerMock来模拟静态方法和私有方法,以便...

    JMOCKIT mock 静态方法 单元测试

    可以用来Mock JAVA代码中的静态方法

    EXT dojochina Ext类静态方法.rar

    EXT dojochina Ext类静态方法是一个关于EXT框架在JavaScript中的使用的主题,主要聚焦于Ext类的静态方法。EXT是一个强大的前端开发框架,由Sencha公司开发,它提供了丰富的组件库,用于构建复杂的Web应用程序。在EXT...

    20.静态方法.zip

    20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20....

    从JVM内存管理的角度谈谈静态方法和静态属性

    静态方法内不能直接访问非静态(实例)属性,因为这些属性属于特定对象,而静态方法没有隐含的对象引用。 非静态方法(实例方法)则包含一个隐含的参数,即对象实例的引用,这个引用在栈中存储。当调用非静态方法时...

    Java中静态方法和非静态方法的区别.docx

    Java 中静态方法和非静态方法的区别 Java 作为一种功能强大、可靠性高、跨平台的编程语言,广泛应用于企业级应用开发、移动应用开发、云计算、大数据处理等领域。了解静态方法和非静态方法的区别是 Java 编程的基础...

    【C# winform 代码】类的静态成员及静态方法

    Microsoft Visual Studio 2010做的C# winform类的静态成员及静态方法,主要代码: public class Student { private int IDBase = 20080000; private int ID; public static int StudentNumber; public string ...

    通过反射调用静态方法

    本文将详细讲解如何通过反射调用静态方法,并探讨在特定场景下,如MyBatis中的应用。 首先,理解反射的概念是至关重要的。在Java中,反射API(java.lang.reflect)允许我们获取类的信息,包括类名、构造函数、方法...

    静态方法,静态成员变量的调用

    在Java编程语言中,静态方法和实例方法是两种不同类型的成员,它们在使用和功能上有所区别。静态方法是属于类级别的,而实例方法是属于对象级别的。理解这两种方法的特性对于编写高效的代码至关重要。 首先,调用...

    Springboot Thymeleaf模板文件调用Java类静态方法

    方法名(参数)}”这种格式来调用Java类的静态方法。 开发环境:IntelliJ IDEA 2019.2.2 Spring Boot版本:2.1.8 新建一个名称为demo的Spring Boot项目。 1、pom.xml 加入Thymeleaf依赖 &lt;groupId&gt;org.spring...

    JAVA静态方法和非静态方法的区别和实例.doc

    JAVA静态方法和非静态方法的区别和实例 静态方法和非静态方法是 Java 编程语言中两个基本概念,它们在编程实践中扮演着重要角色。了解它们的区别和使用场景对于编写高效、可维护的代码至关重要。 什么是静态方法?...

    生成静态的方法

    下面我们将深入探讨静态方法、静态变量以及静态类等相关的知识点。 1. 静态方法 静态方法是与类关联,而不是与类的实例关联的方法。这意味着我们不需要创建类的实例就可以调用静态方法。它们在内存中只有一份,且在...

    c#面向对象静态类、构造方法、静态方法介绍.zip

    在C#编程中,面向对象是核心特性之一,它提供了静态类、构造方法以及静态方法等概念,这些是创建高效、可维护代码的关键元素。让我们深入探讨这些知识点。 首先,静态类是C#中不能被实例化的类,它们只包含静态成员...

    jni调用java静态方法

    在上面的代码中,`FindClass()`用于获取Java类的`jclass`对象,`GetStaticMethodID()`用于获取静态方法的ID,最后`CallStaticVoidMethod()`执行静态方法。注意检查可能的错误,如找不到类或方法,并处理可能出现的...

Global site tag (gtag.js) - Google Analytics