• 如何使用jmockit进行单元测试


    1. Jmockit简介

    JMockit 是用以帮助开发人员编写测试程序的一组工具和API,它完全基于 Java 5 SE 的 java.lang.instrument 包开发,内部使用 ASM 库来修改Java的Bytecode。正是由于基于instrument,可以修改字节码。所以这也是它强大的原因。

    Jmockit可以mock的种类包含了:

    1. class(abstract, final, static)

    2. interface

    3. enum

    4. annotation

    5. native

    Jmockit 有两种mock的方式:

    1. Behavior-oriented(Expectations & Verifications)

    2. State-oriented(MockUp<GenericType>) 

    通俗点讲,Behavior-oriented是基于行为的mock,对mock目标代码的行为进行模仿,更像黑盒测试。State-oriented 是基于状态的mock,是站在目标测试代码内部的。可以对传入的参数进行检查、匹配,才返回某些结果,类似白盒。而State-oriented的 new MockUp基本上可以mock任何代码或逻辑。非常强大。

    (这段介绍来自网络转载)

    2. Jmockit实践

    使用jMockit首先要引用相关的jar包,pom文件引用如下.

    <dependency>
    
    <groupId>org.jmockit</groupId>
    
    <artifactId>jmockit</artifactId>
    
    <version>1.20</version>
    
    <scope>test</scope>
    
    </dependency>
    
    <dependency>
    
    <groupId>org.jmockit</groupId>
    
    <artifactId>jmockit-coverage</artifactId>
    
    <version>1.20</version>
    
    <scope>test</scope>
    
    </dependency>
    
    <dependency>
    
    <groupId>junit</groupId>
    
    <artifactId>junit</artifactId>
    
    <version>4.11</version>
    
    <scope>test</scope>
    
    </dependency> 
     

    2.1 示例1:模拟类

    被测试方法如下:

    其中NegativeTransDos的insert方法是插入数据库。

    为了测试process()方法的逻辑,希望能够模拟dao.insert方法的返回结果,参考测试代码如下:

    可以看到使用jmockit基本有三个步骤:

    (1)打桩。指定要打桩类和函数,模拟返回结果。这里是new Mockup(NegativeTransDos)。

    (2)调用被测方法。被测逻辑执行过程中,之前的打桩数据生效。

    (3)判断测试结果是否符合预期。

    通过以下方法来模拟类和方法。

    new Mockup(类) {

    模拟方法{

              控制该方法返回结果

    }

    }

     

    2.2 示例2:模拟静态方法

     被测试方法如下。其中红框是需要Mock的两个静态方法。通过Jmockit模拟这两个静态方法的返回,只关注EdaStartup方法的自身逻辑。

    参考测试代码如下:

     

     

    2.3 示例3:模拟非静态方法

    被测试方法:

    这里包括两种方法的模拟:

    McEventManager.getReceiver(),这个是静态方法调用的模拟,参考2.1章节。

    receiver.getEvent(),这个是普通对象方法调用。本节关注这种方法的模拟。

    参考测试代码如下:

    首先需要通过 @Injectable 声明要插桩的对象:

    private McEventReceiver receiver;

    之后使用以下方式来插桩:

    new NonStrictExpectations() {

        要模拟的方法(参数1,参数2,…)

        result = 返回结果

    }

    Jmockit提供了很彪悍的万能入参,这一点非常方便。包括:

     

     

    2.4 示例4:模拟private静态方法

    被测代码如下:

    publicMethod()是被测试方法,其中调用了静态成员方法privateMethod。为了摒除privateMethod的影响,需要模拟它的返回结果。

    参考测试代码如下:

     

    test1和test2的输出结果分别是:

     

    2.5 示例5:模拟private非静态方法

    被测代码如下:

    publicMethod()是被测试方法,其中调用了私有非静态成员方法privateMethod。为了摒除privateMethod的影响,需要模拟它的返回结果。

    参考测试代码如下:

    对比2.5私有静态方法的模拟可以看到略有区别。

    new Expectations(XXX) 中,之前指定的是MockClass.class,这里指定的是被测试的MockClass对象。

    test1和test2的输出结果分别是:

     

    2.6 示例6:模拟private非静态成员变量

    被测方法如下:

    其中field是MockField的私有变量。我们目的是能够模拟该私有变量的值,来关注publicMethod方法的测试。

    参考测试代码如下:

    test1和test2的输出结果分别是:

  • 相关阅读:
    [Codeforces Round #498 (Div. 3)] -F. Xor-Paths (折半搜索)
    Best Reward [HDU
    [Educational Codeforces Round 72] A. Creating a Character (简单数学)
    [Codeforces Round #624 (Div. 3)] -E. Construct the Binary Tree (构造二叉树)
    [Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)] -D. Present(异或性质,按位拆分,双指针)
    [Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)] -D. Present(异或性质,按位拆分,树桩数组)
    [Educational Codeforces Round 83 ] E. Array Shrinking
    [AtCoder Beginner Contest 158]
    [CodeCraft-20 (Div. 2)]- E. Team Building (状压DP)
    HDU 3308 LCIS (线段树区间合并)
  • 原文地址:https://www.cnblogs.com/wsy0202/p/11367389.html
Copyright © 2020-2023  润新知