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对象的时候返回一个你事先准备好的值,因此我们测试被测方法的时候仅需要准备这个方法调用的类。

 

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

posted @ 2015-08-17 15:46  Linccy  阅读(4705)  评论(0编辑  收藏  举报