zoukankan      html  css  js  c++  java
  • junit4中Assert断言的使用以及Mockito框架mock模拟对象的简单使用

      编写测试代码时,我们总会有我们对被测方法自己预期的值,以及调用被测方法后返回的真实执行后的值。需要断言这两个值是否相等、抛出异常、hash码等等情况。。。

    这里博主主要介绍一下简单的断言和mock。如果已经对junit测试有过相对了解的,请略过这篇文章。

    下面是我准备的节点类:

     1 package demo;
     2 
     3 /**
     4  * @author Lcc
     5  *
     6  */
     7 public class Node {
     8     private int value;
     9 
    10     public Node(int value) {
    11         this.value = value;
    12     }
    13 
    14     public String toString() {
    15         return "它本来的值是:" + value;
    16     }
    17 
    18     public int getValue() {
    19         return value;
    20     }
    21 
    22     public void setValue(int value) {
    23         this.value = value;
    24     }
    25 
    26 }

    以及节点类的冒泡排序算法:

     1 package demo;
     2 
     3 /**
     4  * @author Lcc
     5  * 
     6  */
     7 public class BubbleSort {
     8 
     9     public Node[] bubbleSort(Node[] a) {
    10 
    11         for (int i = 0; i < a.length; i++) {
    12             for (int j = 0; j < a.length; j++) {
    13                 if (a[i].getValue() > a[j].getValue()) {
    14                     Node temp = a[i];
    15                     a[i] = a[j];
    16                     a[j] = temp;
    17                 }
    18             }
    19         }
    20         System.out.println(a[1].toString());// 没有使用mock时输出:"它本来的值是:2
    21         return a;
    22     }
    23 
    24 }

    现在我们需要测试冒泡排序方法,当然由于这个方法比较简单其实不用mock也可以,但是博主一时间也想不出来有什么好的例子。如果有什么疑问,非常欢迎和博主讨论。

    现在使用没有mock的测试方法(实际情况下,不用mock的情况比较少。这里仅作为对比)

    package demo;
    
    import org.junit.Assert;
    import org.junit.Test;
    /**
     * @author Lcc
     * 
     */
    public class BubbleSortTest {
    
        BubbleSort bubbleSort = new BubbleSort();
    
        /**
         * bubbleSort的测试方法
         */
        @Test
        public void testBubbleSort() {
            
            Node node1 = new Node(1);
            Node node2 = new Node(2);
            Node node3 = new Node(3);
    
            Node[] nodes = {node1,node2,node3};
            
            bubbleSort.bubbleSort(nodes);
            Assert.assertEquals(3, nodes[0].getValue());
            Assert.assertEquals(2, nodes[1].getValue());
            Assert.assertEquals(1, nodes[2].getValue());
        }
    
    }

    这里解释一下assertEquals的作用:

    assertEquals([String message],Object target,Object result)  target与result不相等,中断测试方法,输出message
    assertEquals(a, b) 测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)
    assertEquals断言两个对象相等,若不满足,方法抛出带有相应信息的AssertionFailedError异常。

    其他具体的断言请参照  http://ryxxlong.iteye.com/blog/716428

    这里就不一一赘述了。

    下面我们来使用mock来测试这个方法:

     1 package demo;
     2 
     3 import org.junit.Assert;
     4 import org.junit.Test;
     5 import static org.mockito.Mockito.*;
     6 
     7 /**
     8  * @author Lcc
     9  * 
    10  */
    11 public class BubbleSortTest {
    12 
    13     BubbleSort bubbleSort = new BubbleSort();
    14 
    15     /**
    16      * bubbleSort的测试方法
    17      */
    18     @Test
    19     public void testBubbleSort() {
    20         
    21         Node node1 = new Node(1);
    22 //        Node node2 = new Node(2);
    23         Node mockNode2 = mock(Node.class);
    24         Node node3 = new Node(3);
    25 
    26         when(mockNode2.getValue()).thenReturn(2);
    27         when(mockNode2.toString()).thenReturn("现在输出的就是mock的调用when后你准备的值了");
    28         
    29         Node[] nodes = {node1,mockNode2,node3};
    30         
    31         bubbleSort.bubbleSort(nodes);
    32         Assert.assertEquals(3, nodes[0].getValue());
    33         Assert.assertSame(mockNode2, nodes[1]);//由于我们mock了node2.getValue()所以不能直接断言这个方法,应该断言它的hash码
    34         Assert.assertEquals(1, nodes[2].getValue());
    35     }
    36 
    37 }

    现在运行junit test 冒泡排序中的System.out.println输出的就是我们mock的值。mock简单的来说就是模拟,不是真实的去执行,而是在调用mock对象的时候返回一个你事先准备好的值,因此我们测试被测方法的时候仅需要准备这个方法调用的类。

    代码和文章写的不好,感谢浏览!希望这篇文章能够对各位有帮助。

  • 相关阅读:
    Android游戏开发22:Android动画的实现J2me游戏类库用于Android开发
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第三部分,完整代码)
    使用OGR创建dxf格式矢量数据
    mysql 数据库引擎 MyISAM InnoDB 大比拼 区别
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)
    mysql 更改数据库引擎
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第一部分)
    android 数字键盘使用
    MySQL Innodb数据库性能实践
    eclipse : Error while performing database login with the driver null
  • 原文地址:https://www.cnblogs.com/Linccy/p/4736789.html
Copyright © 2011-2022 走看看