编写测试代码时,我们总会有我们对被测方法自己预期的值,以及调用被测方法后返回的真实执行后的值。需要断言这两个值是否相等、抛出异常、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对象的时候返回一个你事先准备好的值,因此我们测试被测方法的时候仅需要准备这个方法调用的类。
代码和文章写的不好,感谢浏览!希望这篇文章能够对各位有帮助。