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

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

时间: 2024-10-06 15:46:19

【原创】junit4中Assert断言的使用以及Mockito框架mock模拟对象的简单使用的相关文章

Java中assert(断言)的使用

1.Eclipse中默认assert(断言)是关闭,开启方式如下: 简单来说:就是设置一下jvm的参数,参数是-enableassertions或者-ea(推荐). 2.assert格式 1.格式1 assert [boolean 表达式] 如果[boolean表达式]为true,则程序继续执行. 如果为false,则程序抛出AssertionError,并终止执行. 2.格式2 assert [boolean 表达式 : 错误表达式 (日志)] 如果[boolean表达式]为true,则程序继

JUnit4 中@AfterClass @BeforeClass @after @before的区别对比

  @BeforeClass and @AfterClass @Before and @After 出现次数 在一个类中只可以出现一次 在一个类中可以出现多次,即可以在多个方法的声明前加上这两个Annotaion标签,执行顺序不确定 方法名限制 方法名不做限制 方法名不做限制 运行次数 在类中只运行一次 在每个测试方法之前或者之后都会运行一次 执行顺序 @BeforeClass父类中标识了该Annotation的方法将会先于当前类中标识了该Annotation的方法执行.@AfterClass

Python学习-41.Python中的断言

先来点题外话: 在现代编程开发中,TDD(测试驱动开发)变得越来越流行(PS:DDD(领域驱动开发)也是,但两者并不冲突,就像面向过程和面向对象).而作为TDD的根本——单元测试也是越来越重要,单元测试可以测试代码的正确性,例如以下的C#代码: 1 public class Helper 2 { 3 public string RemoveHtmlMarkup(string str) 4 { 5 return str; 6 } 7 } 需求是去除字符串中的html标记.当然现在这样是错误的,只会

Spring Assert断言工具类

Spring 中 org.springframework.util.Assert 类实现合法性检测,Assert的方法如下: 断言方法说明: 1. notNull(Object object)  当 object 不为 null 时抛出异常,notNull(Object object, String message) 方法允许您通过 message 定制异常信息.和 notNull() 方法断言规则相反的方法是 isNull(Object object)/isNull(Object object

C++ ASSERT() 断言机制

C++ ASSERT() 断言机制 ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行.如果表达式不为0,则继续执行后面的语句.这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误. 原型定义: #include <assert.h> void assert( int expression_r_r_r ); assert的作用是现计算表达式 expres

java中的断言

断言:也就是所谓的assertion,是jdk1.4后加入的新功能. 它主要使用在代码开发和测试时期,用于对某些关键数据的判断,如果这个关键数据不是你程序所预期的数据,程序就提出警告或退出. 当软件正式发布后,可以取消断言部分的代码.java中使用assert作为断言的一个关键字,这就可以看出java对断言还是很重视的,因为如果不是很重要的话,直接开发个类就可以了,没必要新定义一个关键字. 语法1:assert expression;                //expression代表一

Spring Assert断言 (方法入参检测工具类-断言)

Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回.类似的,当我们在编写类的方法时,也常常需要对方法入参进行合 法性检查,如果入参不符合要求,方法将通过抛出异常的方式拒绝后续处理.举一个例子:有一个根据文件名获取输入流的方法:InputStream getData(String file),为了使方法能够成功执行,必须保证 file 入参不能为 null 或空白字符,否则根本无须进行后继的处理.这时方法的编写者通常会在方法体的最前面编写一段对入参进行检测

ASSERT断言

ASSERT断言 编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真.可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言.同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言. 代码执行之前必须具备的特性: assert是宏,而不是函数: 使用断言可以创建更稳定,品质更好且不易于出错的代码. 断言语句不是永远会执行,可以屏蔽也可以启用

assert断言语句调试程序

之前工作在测试中经常会碰到断言挂起,每次出现断言只知道有故障了,但是并没有深究断言是怎么回事,今天学习了python中的断言语句,其实挺简单. 1.assert语句的语法: assert expression [,reason] expression :表达式为真时,什么都不做,表达式为假时,抛出AssertionError异常: reason:可选参数,用于对判断条件进行描述,为了以后更好的知道哪里出现了问题. 2.assert语句只在调试阶段有效.所以我们平时测试用的debug版本才会有断言