一。概述

二、Junit方式使用

2.1、基本使用

  eclipse在新建的类上,右键→new→Junit Test Case,修改一下Source folder,选择src/test/java,下一步,选择需要测试的方法即可.

  idea mac上在类内,cmd+shift+T,即可

1》在测试类开头增加

@RunWith(SpringRunner.class)
@SpringBootTest

  示例如下

待测试类

@Repository
public class UserDao {
public Integer addUser(String username) {
System.out.println("user dao adduser [username="+username+"]");
if(username==null) {
return 0;
}
return 1;
}
}

测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest { @Autowired
private UserDao userDao; @Test
public void testAddUser() {
Assert.assertEquals(Integer.valueOf(1), userDao.addUser("s"));
Assert.assertEquals(Integer.valueOf(0), userDao.addUser(null));
}
}

2.2、加载测试Bean

1》增加测试configuration

/**
* 只能测试环境下使用
* 只能用@TestConfiguration 不能使用@Configuration
*
*/
@TestConfiguration
public class TestBeanConfiguration { @Bean
public Runnable createRunnable() {
return ()->{};
}
}

2》在调用类处增加如下

@RunWith(SpringRunner.class)
@SpringBootTest(classes=TestBeanConfiguration.class)

2.3、测试配置文件

可以读取src/main/resources,也可以使用src/test/resources,如果有相同的优先使用测试环境配置,

@RunWith(SpringRunner.class)
@SpringBootTest
public class EnvTest {
@Autowired
private ConfigurableEnvironment env; @Test
public void testEnv() {
Assert.assertEquals("springboot", env.getProperty("app.name"));
}
}

2.4、指定配置项

@RunWith(SpringRunner.class)
@SpringBootTest(properties= {"app.version=1.0.0"})

或者

    @Before
public void init() {
EnvironmentTestUtils.addEnvironment(env, "app.admin.name=admin");
}

三、mock方式

3.1、测试接口,提前预估一些量

@RunWith(SpringRunner.class)
public class UserMapperTest { @MockBean
private UserMapper usermapper; @Before
public void init() {
BDDMockito.given(usermapper.createUser("admin")).willReturn(Integer.valueOf(1));
BDDMockito.given(usermapper.createUser("")).willReturn(Integer.valueOf(0));
BDDMockito.given(usermapper.createUser(null)).willThrow(NullPointerException.class);
} @Test(expected = NullPointerException.class)
public void testCreateUser() {
Assert.assertEquals(Integer.valueOf(1), usermapper.createUser("admin"));
Assert.assertEquals(Integer.valueOf(0), usermapper.createUser(""));
Assert.assertEquals(Integer.valueOf(0), usermapper.createUser(null));
}
}

四、Controller测试

第一种使用:TestRestTemplate

1》需要测试类增加

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

2》需要使用TestRestTemplate 需运行在web环境

    @Autowired
private TestRestTemplate restTemplate;

示例:

需要被测试的Controller

@RestController
public class BookController {
@GetMapping("/book/home")
public String home() {
System.out.println("/book/home url is invode.");
return "home";
} @GetMapping("/book/show")
public String show(String id) {
System.out.println("/book/show url is invode.");
return "book" + id;
}
}

测试类

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class BookControllerTest { @Autowired
private TestRestTemplate restTemplate; @Test
public void testHome() {
String object = restTemplate.getForObject("/book/home", String.class);
Assert.assertEquals("home", object);
} @Test
public void testShow() {
String object = restTemplate.getForObject("/book/show?id=100", String.class);
Assert.assertEquals("book100", object);
}
}

第二种使用:MockMvc

1》配置

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = BookController.class)

2》程序使用

    @Autowired
private MockMvc mvc;

示例,对以上示例测试

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = BookController.class)
public class BookControllerTest2 { @Autowired
private MockMvc mvc; @Test
public void testHome() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/book/home")).andExpect(MockMvcResultMatchers.status().isOk());
mvc.perform(MockMvcRequestBuilders.get("/book/home")).andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("home"));
} @Test
public void testShow() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/book/show").param("id", "400"))
.andExpect(MockMvcResultMatchers.status().isOk());
mvc.perform(MockMvcRequestBuilders.get("/book/show").param("id", "400"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("book400"));
}
}

现将BookController改造,增加了Dao使用

@RestController
public class BookController {
@Autowired
private UserDao userDao;
@GetMapping("/book/home")
public String home() {
System.out.println("/book/home url is invode.");
return "home";
} @GetMapping("/book/show")
public String show(String id) {
System.out.println("/book/show url is invode.");
userDao.addUser("");
return "book" + id;
}
}

现在使用第二种方式,不能通过,因为WebMvcTest(controllers = BookController.class)方式只是加载指定类,没有加载Spring全部容器,所以第二种只能测试controller,依赖需要自己mock

使用第一种方式,加载Spring全部容器。

如果使用第二种,还需要加载全部容器

第三种、MockMv加载全部容器

  @SpringBootTest不能和@WebMvcTest同时使用

  如果使用MockMvc对象的话需要使用一下方式

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class BookControllerTest3 { @Autowired
private MockMvc mvc; @Test
public void testHome() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/book/home")).andExpect(MockMvcResultMatchers.status().isOk());
mvc.perform(MockMvcRequestBuilders.get("/book/home")).andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("home"));
}
}

021-Spring Boot 测试,Junit方式使用,mock方式,Controller测试的更多相关文章

  1. Spring Boot 解决方案 - JUnit 测试

    简单的 JUnit 项目 回顾一下创建并运行简单的 JUnit 测试项目,先添加 JUnit 依赖然后编写类似如下模板的测试类,使用 IDE 的话直接用插件运行就行, 使用 Maven 的话运行命令 ...

  2. Spring Boot 整合 Shiro ,两种方式全总结!

    在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro. 今天松哥就来和大家聊聊 Spring Boot ...

  3. Spring Boot 整合Junit和redis

    14. Spring Boot整合-Junit 目标:在Spring Boot项目中使用Junit进行单元测试UserService的方法 分析: 添加启动器依赖spring-boot-starter ...

  4. Spring Boot配置过滤器的两种方式

    过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,常用的场景有登录校验.权限控制.敏感词过滤等,下面介绍下Spring Boot配置过 ...

  5. Java框架spring Boot学习笔记(三):Controller的使用

    Controller注解介绍 @Controller:处理http请求 @RestController: Spirng4之后新加的注解,其实是一个组合注解等同于@ResponseBody和@Contr ...

  6. Spring Boot中采用Mockito来mock所测试的类的依赖(避免加载spring bean,避免启动服务器)

    最近试用了一下Mockito,感觉真的挺方便的.举几个应用实例: 1,需要测试的service中注入的有一个dao,而我并不需要去测试这个dao的逻辑,只需要对service进行测试.这个时候怎么办呢 ...

  7. 基于Spring Boot框架开发的一个Mock

    背景:在项目后端接口开发还未完成,我们无法进行自动化接口用例的调试,希望与开发同步完成接口自动化用例的编写及调试,待项目转测后,可以直接跑自动化用例,提高测试效率. 选用的maven + Spring ...

  8. Spring Boot的web开发&静态资源配置方式

    Web开发的自动配置类:org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 1.1. 自动配置的ViewResolve ...

  9. 干货分享:ASP.NET CORE(C#)与Spring Boot MVC(JAVA)异曲同工的编程方式总结

    目录 C# VS JAVA 基础语法类比篇: 一.匿名类 二.类型初始化 三.委托(方法引用) 四.Lambda表达式 五.泛型 六.自动释放 七.重写(override) ASP.NET CORE ...

  10. 【websocket】spring boot 集成 websocket 的四种方式

    集成 websocket 的四种方案 1. 原生注解 pom.xml <dependency> <groupId>org.springframework.boot</gr ...

随机推荐

  1. nginx 根据域名反向代理

    #nginx 反向代理域名,会根据启动时候解析出来的ip,加载到内存中,后面不会改变可以绑定hosts或者指定resolve服务器来固定ip #注意proxy最后的斜杠,如果不加会将请求过来的目录带到 ...

  2. php中的匿名函数的注意事项

    在php5.3以后,php加入匿名函数的使用,今天在使用匿名的时候出现错误,不能想php函数那样声明和使用,详细看代码 $callback=function(){ return "aa&qu ...

  3. Atitit.php opcode虚拟机指令集 分类以及详细解释

    Atitit.php opcode虚拟机指令集 分类以及详细解释 1. 指令集常用分类:: Mov移动指令 算数逻辑移位指令 跳转指令 Oo指令 类型转换指令 2. 与jvm  clr指令集合对比 P ...

  4. Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle

    Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle 1. 主键1 2. uniq  index2 3.  ...

  5. Python内置函数之bool()

    该函数是一个类对象 class bool([x]) bool()只能传入一个参数. bool()用来判断对象是否为True,返回值为True或者False. 下面看看例子: >>> ...

  6. C++中两个类相互include的问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 例如: Cup.h #ifndef CUP_H #define CUP_ ...

  7. XCode 4.6下XIB文件提示“...could not be opened..."的问题

    最近更新了Mac系统和XCode,当我把一个以前的项目用Xcode5打开以后,再用Xcode4.6打开时,选中XXXX.xib/storyboard文件,有的文件会弹出 "The docum ...

  8. PHP 高精度计算

    运行bcsub函数需要 php-bcmath的扩展. Php: BCMath bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如st ...

  9. 【转】Monkey测试5-运行中停止monkey

    停止monkey自动测试步骤: 1.ps命令  查找uiautomator的进程 打开cmd命令行窗口 输入: adb shell ; ps | grep monkey; 返回来的第一个数字,即是mo ...

  10. spark 1.3 发布了

    悄悄地,spark 还是像往常一样,发布了1.3版本,从release notes可以看出,这一版本比较大的变化是1. 增加了DataFrame API,这样以后操作一些结构化的数据集时将会变的非常方 ...