转载:https://blog.csdn.net/maiyikai/article/details/78483423

本来要写springboot集成netty实现的,但是想起来单元测试没总结,那就趁此机会总结一下,不用文字了,直接用代码去实现: 
创建一个放方法的类MethodTest.java:(命名不严谨,能看懂就行了)

package com.mtk.netty.test;

import org.springframework.stereotype.Component;

@Component
public class MethodTest { //主方法
public String gg(boolean flag){
System.err.println("coming.........");
String d = g(flag);//子方法
h();
System.err.println("result data is "+d);
return d;
} public String g(boolean flag){
System.err.println("coming.........g");
if(flag){
throw new IllegalAccessError();//flag为true时抛异常
}
return "d";
} public void h(){
System.err.println("coming.........h");
}
}

使用上边的方法类,写单元测试: 
这里时spy方式:

package com.mtk.netty.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration; import com.myk.Application; /**
* 使用spy方式
* @author maiyikai 2017.11.08
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
public class SpyTest {
//gg(boolean)方法:控制台打印: coming.........
//g(boolean)方法:控制台打印: coming.........g
//h()方法:控制台打印: coming.........h
//gg(boolean)方法在g(boolean)和h()方法执行完之后:控制台打印: result data is * /**
* 使用代理:如下方式
* 或Mockito.spy(MethodTest.class)获得代理对象
*/
@SpyBean
private MethodTest spyTest; /**
* 不代理,直接运行程序
* 控制台打印:
* coming.........
* coming.........g
* coming.........h
* result data is d
* d
*/
@Test
public void test(){
System.err.println(spyTest.gg(false));
} /**
* 不使用代理:让g方法抛异常
* 控制台打印
* coming.........
* coming.........g
* 由于抛异常,程序中断
*/
@Test
public void test2(){
System.err.println(spyTest.gg(true));
} /**
* 使用代理对象,代理g方法,并让其返回“test”
* 第一种方式:使用thenReturn("test");
* 控制台打印:
* coming.........g
* coming.........
* coming.........h
* result data is test
* test
*
*/
@Test
public void test3(){
Mockito.when(spyTest.g(false)).thenReturn("test"); System.err.println(spyTest.gg(false));
}
/**
* 使用代理对象,代理g方法,并让其返回“test”
* 第二种方式:使用doReturn("test");
* 其中doReturn("test")后执行.when(spyTest).g(false)方法
* 控制台打印:
* coming.........
* coming.........h
* result data is test
* test
*
*/
@Test
public void test4(){
Mockito.doReturn("test").when(spyTest).g(false);
System.err.println(spyTest.gg(false));
}
/**
* test3-test4比较
* 正常执行顺序
* coming.........
* coming.........g
* coming.........h
* result data is d
* d
* 使用Mockito.when(spyTest.g(false)).thenReturn("test");方式
* g(boolean)方法会在调用主方法gg(boolean)前执行,不管执行的结果是啥,都会按照mock的数据“test”返回
*
* 使用Mockito.doReturn("test").when(spyTest).g(false);方式
* g(boolean)方法不会被执行,当时会将它的返回值赋值为:“test”。
* 在主方法gg(boolean)执行到g(boolean)时,不执行g(boolean)方法体,直接将值“test'”返回。后续方法照常执行
*/
//#######################################################################################
/**
* 使用代理对象,代理gg方法,并让其返回“test”
* 第一种方式:使用thenReturn("test");
* 控制台打印:
* coming.........g
*
*/
@Test
public void test5(){
Mockito.when(spyTest.g(true)).thenReturn("test");
System.err.println(spyTest.gg(true));
} /**
* 使用代理对象,代理gg方法,并让其返回“test”
* 第二种方式:使用doReturn("test");
* 其中doReturn("test")后执行.when(spyTest).g(true)方法--抛异常
* 控制台打印:
* coming.........
* coming.........h
* result data is test
* test
*
*/
@Test
public void test6(){
Mockito.doReturn("test").when(spyTest).g(true);
System.err.println(spyTest.gg(true));
} /**
* test5-test6比较
* 故意赋值让其方法抛异常。
* 正常执行顺序
* coming.........
* coming.........g
* coming.........h
* result data is d
* d
*
* 因为:Mockito.when(spyTest.g(true)).thenReturn("test");会执行方法体的内容,则g(boolean)方法体会被执行,会抛出异常中断程序运行
* 而Mockito.doReturn("test").when(spyTest).g(true);方法体不会被执行,则不会抛出异常,不会造成程序中断
*/ //##################################无返回值######################
/**
* 无返回值方法的代理
* 方法为h()
* 因此方法对代码不造成任何影响,所以可以不执行它
* 可以使用:doNothing
* 代码:Mockito.doNothing().when(spyTest).h();
*/
@Test
public void test7(){
Mockito.doNothing().when(spyTest).h(); System.err.println(spyTest.gg(false));
} /**
* 测试
* coming.........
* coming.........g
* result data is d
* d
*/
@Test
public void test10(){
Mockito.doReturn("23").when(spyTest).g(true);
Mockito.doNothing().when(spyTest).h(); System.err.println(spyTest.gg(false));
}
}

这里时mock的方式:

package com.mtk.netty.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration; import com.myk.Application; /**
* 使用mock方式
* @author maiyikai 2017.11.08
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
public class MockTest { //gg(boolean)方法:控制台打印: coming.........
//g(boolean)方法:控制台打印: coming.........g
//h()方法:控制台打印: coming.........h
//gg(boolean)方法在g(boolean)和h()方法执行完之后:控制台打印: result data is * /**
* 使用代理:如下方式
* 或Mockito.mock(MethodTest.class)获得代理对象
*/
@MockBean
private MethodTest mockTest; /**
* 使用mock方式将会把对象给mock掉,则对象中的方法将不会被执行,但是使用到某方法时可以mock值,供调用方法使用
*/ /**
* 访问主方法体gg(boolean)
* 返回null
*/
@Test
public void test1(){
System.err.println(mockTest.gg(false));
} /**
* mock方法gg(boolean),使其在使用到gg(boolean)方法时,返回:"test"
*/
@Test
public void test2(){
Mockito.when(mockTest.gg(false)).thenReturn("test"); System.err.println(mockTest.gg(false));
}
/**
* mock方法gg(boolean),使其在使用到gg(boolean)方法时,返回:"test"
*/
@Test
public void test3(){
Mockito.doReturn("test").when(mockTest).gg(false); System.err.println(mockTest.gg(false));
}
/**
* mock方法gg(boolean),使其在使用到gg(boolean)方法时,返回:"test"
*/
@Test
public void test4(){
Mockito.when(mockTest.gg(false)).thenAnswer(new Answer<String>() {
//Answer<T> T为方法的返回值类型
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
return "test";
}
}); System.err.println(mockTest.gg(false));
}
/**
* mock方法gg(boolean),使其在执行到此方法时抛出自定义异常
*/
@Test
public void test5(){
Mockito.when(mockTest.gg(false)).thenThrow( new IllegalArgumentException("单元测试异常")); System.err.println(mockTest.gg(false));
} //对与返回值类型为void的操作有
//1.直接mock对象,即此对象中所有的方法都不会被执行
//2.使用Mockito.doNothing().when(mockObject).method();标记执行该方法时不做任何操作
}

因时间有限,写了一些简单的操作; 
写单元测试的过程中,有想过“只需要mock方法类中的某个方法,其他的方法不受影响”;之前使用MockBean就出问题了,研究了一下使用SpyBean就可以使用了,可以看上边的例子就可以知道了。 
springboot的文档介绍也是可以看的:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html “springboot 
我的项目上传地址:http://download.csdn.net/download/maiyikai/10110450

Springboot单元测试(MockBean||SpyBean)的更多相关文章

  1. Springboot单元测试Junit深度实践

    Springboot单元测试Junit深度实践 前言 单元测试的好处估计大家也都知道了,但是大家可以发现在国内IT公司中真正推行单测的很少很少,一些大厂大部分也只是在核心产品推广单测来保障质量,今天这 ...

  2. springmvc,springboot单元测试配置

    1. springmvc单元测试配置 <dependency> <groupId>junit</groupId> <artifactId>junit&l ...

  3. SpringBoot单元测试中的事务和Session

    1.Springboot中使用junit编写单元测试,并且测试结果不影响数据库. 2.

  4. SpringBoot单元测试

    一.Service层Junit单元测试 需要的jar包 <dependency> <groupId>org.springframework.boot</groupId&g ...

  5. springboot(十二):springboot单元测试、打包部署

    单元测试 1.在pom包中添加spring-boot-starter-test包引用 <dependency> <groupId>org.springframework.boo ...

  6. springboot系列三、springboot 单元测试、配置访问路径、多个配置文件和多环境配置,项目打包发布

    一.单元测试 生成的demo里面包含spring-boot-starter-test :测试模块,包括JUnit.Hamcrest.Mockito,没有的手动加上. <dependency> ...

  7. 五、springboot单元测试

    1.为什么要写测试用例 1. 可以避免测试点的遗漏,为了更好的进行测试,可以提高测试效率 2. 可以自动测试,可以在项目打包前进行测试校验 3. 可以及时发现因为修改代码导致新的问题的出现,并及时解决 ...

  8. springBoot单元测试-基础单元测试

    1)在pom文件中加入junit支持 <!-- spring-boot-starter-test 单元测试 --> <dependency> <groupId>or ...

  9. 【使用篇二】SpringBoot单元测试(10)

    SpringCloud单元测试:https://www.cnblogs.com/myitnews/p/11796321.html 1. 创建项目Maven Project,修改pom.xml < ...

随机推荐

  1. MySQL编码latin1转utf8

    mysql移植含有中文的数据时,很容易出现乱码问题.很多是在从mysql4.x向mysql5.x移植的时候出现.mysql的缺省字符集是 latin1,在使用mysql4.x的时候,很多人都是用的la ...

  2. How AOT compares to a traditional JIT compiler

    Ahead-of-Time (AOT) compilation is in contrast to Just-in-Time compilation (JIT). In a nutshell, .NE ...

  3. 报错:System.Data.Entity.Validation.DbEntityValidationException: 对一个或多个实体的验证失败

    使用MVC和EF,在保存数据的时候报错:System.Data.Entity.Validation.DbEntityValidationException: 对一个或多个实体的验证失败.有关详细信息, ...

  4. 通过进程ID获取基地址

    下面代码是通过进程ID来获取进程的基地址,创建一个进程快照后,读取进程模块,一般情况下第一个模块就是进程的基地址,下面的程序通过模块的字符串匹配来找到基地址.通过MODULEENTRY32来读取,下面 ...

  5. Android:活动的简单使用

    2.1    活动是什么 活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件, 主要用于和用户进行交互.一个应用程序中可以包含零个或多个活动,但不包含任何活动的 应用程 ...

  6. 初步理解JWT并实践使用

    原文:https://www.jianshu.com/p/2fdc20a42c41 JWT是一种用于双方之间传递安全信息的简洁的.URL安全的表述性声明规范.JWT作为一个开放的标准(RFC 7519 ...

  7. C++笔记:头文件的作用和写法

    from://http://ceeji.net/blog/c%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%B4%E6%96%87%E4%BB%B6%E7%9A%84%E4%BD% ...

  8. JForum 源码分析

    怎么才算好的源码分析呢?当然我这个肯定不算.我想大概分为几个层面吧,写写注释那算最基本的了,写写要点思路和难点,算是还不错拉,再难的就是跳出源码举一反三,形成自己的一套思路吧.好好努力吧. 这次针对的 ...

  9. 如何解决SSH连接Linux超时自动断开?

    最近项目开发中用到云服务器,部署了MySQL,开发团队总是反映MySQL过一会儿就断开连接了,必须手动重连才可以.反映越来越强烈,已经到了影响开发进度的高度了,必须解决! 查了资料,这个可能和SSH超 ...

  10. Oracle锦集

    1:将数组转成datatable SELECT COLUMN_VALUE FROM TABLE(CAST(UTIL.INTONUMBERTABLE(REPLACE(NVL(V_CATEGORY_ID, ...